package ani.dantotsu.parsers import android.content.Context import ani.dantotsu.Lazier import ani.dantotsu.lazyList import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.settings.saving.PrefWrapper import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first object AnimeSources : WatchSources() { override var list: List> = emptyList() var pinnedAnimeSources: Set = emptySet() suspend fun init(fromExtensions: StateFlow>, context: Context) { pinnedAnimeSources = PrefWrapper.getVal(PrefName.PinnedAnimeSources, emptySet()) // Initialize with the first value from StateFlow val initialExtensions = fromExtensions.first() list = createParsersFromExtensions(initialExtensions) + Lazier( { OfflineAnimeParser() }, "Downloaded" ) // Update as StateFlow emits new values fromExtensions.collect { extensions -> list = sortPinnedAnimeSources( createParsersFromExtensions(extensions), pinnedAnimeSources ) + Lazier( { OfflineAnimeParser() }, "Downloaded" ) } } fun performReorderAnimeSources() { //remove the downloaded source from the list to avoid duplicates list = list.filter { it.name != "Downloaded" } list = sortPinnedAnimeSources(list, pinnedAnimeSources) + Lazier( { OfflineAnimeParser() }, "Downloaded" ) } private fun createParsersFromExtensions(extensions: List): List> { return extensions.map { extension -> val name = extension.name Lazier({ DynamicAnimeParser(extension) }, name) } } private fun sortPinnedAnimeSources( Sources: List>, pinnedAnimeSources: Set ): List> { //find the pinned sources val pinnedSources = Sources.filter { pinnedAnimeSources.contains(it.name) } //find the unpinned sources val unpinnedSources = Sources.filter { !pinnedAnimeSources.contains(it.name) } //put the pinned sources at the top of the list return pinnedSources + unpinnedSources } } object HAnimeSources : WatchSources() { private val aList: List> = lazyList( ) override val list = listOf(aList, AnimeSources.list).flatten() }