package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.InlineQueries.ChosenInlineResult.* import dev.inmo.tgbotapi.types.polls.* import kotlinx.coroutines.flow.toList typealias ChosenInlineResultMapper = suspend T.() -> T? private suspend fun BehaviourContext.waitChosenInlineResultsUpdates( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: SimpleFilter? = null, mapper: suspend ChosenInlineResult.() -> O? ): List = expectFlow( initRequest, count, errorFactory ) { val data = it.asChosenInlineResultUpdate() ?.data if (data != null && (filter == null || filter(data))) { data.mapper().let(::listOfNotNull) } else { emptyList() } }.toList().toList() private suspend inline fun BehaviourContext.waitChosenInlineResults( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, filter: SimpleFilter? = null, noinline mapper: ChosenInlineResultMapper? = null ) : List = this@waitChosenInlineResults.waitChosenInlineResultsUpdates( count, initRequest, errorFactory, filter ?.let { { (it as? T) ?.let { filter(it) } == true } } ) { if (this is T) { if (mapper == null) { this } else { mapper(this) } } else { null } } suspend fun BehaviourContext.waitChosenInlineResult( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter? = null, mapper: ChosenInlineResultMapper? = null ) = waitChosenInlineResults(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitLocationChosenInlineResult( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter? = null, mapper: PollMapper? = null ) = waitChosenInlineResults(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitBaseChosenInlineResult( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter? = null, mapper: PollMapper? = null ) = waitChosenInlineResults(count, initRequest, errorFactory, filter, mapper)