package ani.dantotsu.parsers import ani.dantotsu.Lazier import ani.dantotsu.lazyList import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first object MangaSources : MangaReadSources() { override var list: List> = emptyList() var pinnedMangaSources: List = emptyList() suspend fun init(fromExtensions: StateFlow>) { pinnedMangaSources = PrefManager.getNullableVal>(PrefName.MangaSourcesOrder, null) ?: emptyList() // Initialize with the first value from StateFlow val initialExtensions = fromExtensions.first() list = createParsersFromExtensions(initialExtensions) + Lazier( { OfflineMangaParser() }, "Downloaded" ) // Update as StateFlow emits new values fromExtensions.collect { extensions -> list = sortPinnedMangaSources( createParsersFromExtensions(extensions), pinnedMangaSources ) + Lazier( { OfflineMangaParser() }, "Downloaded" ) } } fun performReorderMangaSources() { //remove the downloaded source from the list to avoid duplicates list = list.filter { it.name != "Downloaded" } list = sortPinnedMangaSources(list, pinnedMangaSources) + Lazier( { OfflineMangaParser() }, "Downloaded" ) } private fun createParsersFromExtensions(extensions: List): List> { return extensions.map { extension -> val name = extension.name Lazier({ DynamicMangaParser(extension) }, name) } } private fun sortPinnedMangaSources( sources: List>, pinnedMangaSources: List ): List> { val pinnedSourcesMap = sources.filter { pinnedMangaSources.contains(it.name) } .associateBy { it.name } val orderedPinnedSources = pinnedMangaSources.mapNotNull { name -> pinnedSourcesMap[name] } val unpinnedSources = sources.filterNot { pinnedMangaSources.contains(it.name) } return orderedPinnedSources + unpinnedSources } } object HMangaSources : MangaReadSources() { private val aList: List> = lazyList() override val list = listOf(aList, MangaSources.list).flatten() }