package it.vfsfitvnm.vimusic.savers import androidx.compose.runtime.saveable.Saver import androidx.compose.runtime.saveable.SaverScope import it.vfsfitvnm.youtubemusic.Innertube interface ListSaver : Saver, List> { override fun SaverScope.save(value: List): List override fun restore(value: List): List } fun resultSaver(saver: Saver) = object : Saver?, Pair> { override fun restore(value: Pair) = value.first?.let(saver::restore)?.let(Result.Companion::success) ?: value.second?.let(Result.Companion::failure) override fun SaverScope.save(value: Result?) = with(saver) { value?.getOrNull()?.let { save(it) } } to value?.exceptionOrNull() } fun listSaver(saver: Saver) = object : ListSaver { override fun restore(value: List) = value.mapNotNull(saver::restore) override fun SaverScope.save(value: List) = with(saver) { value.mapNotNull { save(it) } } } fun nullableSaver(saver: Saver) = object : Saver { override fun SaverScope.save(value: Original?): Saveable? = value?.let { with(saver) { save(it) } } override fun restore(value: Saveable): Original? = saver.restore(value) } fun innertubeItemsPageSaver(saver: ListSaver>) = object : Saver, List> { override fun SaverScope.save(value: Innertube.ItemsPage) = listOf( value.items?.let { with(saver) { save(it) } }, value.continuation ) @Suppress("UNCHECKED_CAST") override fun restore(value: List) = Innertube.ItemsPage( items = (value[0] as List>?)?.let(saver::restore), continuation = value[1] as String? ) }