package dev.inmo.tgbotapi.extensions.utils.shortcuts import dev.inmo.micro_utils.coroutines.safely import dev.inmo.tgbotapi.bot.RequestsExecutor import dev.inmo.tgbotapi.requests.abstracts.Request import kotlinx.coroutines.* import kotlin.coroutines.coroutineContext fun RequestsExecutor.executeAsync( request: Request, scope: CoroutineScope ): Deferred = scope.async { safely { execute(request) } } suspend fun RequestsExecutor.executeAsync( request: Request ): Deferred = executeAsync(request, CoroutineScope(coroutineContext)) suspend fun RequestsExecutor.executeUnsafe( request: Request, retries: Int = 0, retriesDelay: Long = 1000L, onAllFailed: (suspend (exceptions: Array) -> Unit)? = null ): T? { var leftRetries = retries val exceptions = onAllFailed ?.let { mutableListOf() } do { return safely ( { leftRetries-- delay(retriesDelay) exceptions ?.add(it) null } ) { execute(request) } ?: continue } while(leftRetries >= 0) onAllFailed ?.invoke(exceptions ?.toTypedArray() ?: emptyArray()) return null }