package dev.inmo.micro_utils.coroutines import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.Channel import kotlin.coroutines.* interface ActorAction { suspend operator fun invoke(): T } /** * Planned to use with [doWithSuspending]. Will execute incoming lambdas sequentially * * @see actor */ fun CoroutineScope.createActionsActor() = actor Unit> { it() } /** * Planned to use with [doWithSuspending]. Will execute incoming lambdas sequentially * * @see safeActor */ inline fun CoroutineScope.createSafeActionsActor( noinline onException: ExceptionHandler = defaultSafelyExceptionHandler ) = safeActor Unit>(Channel.UNLIMITED, onException) { it() } /** * Must be use with actor created by [createActionsActor] or [createSafeActionsActor]. Will send lambda which will * execute [action] and return result. * * @see suspendCoroutine * @see safely */ suspend fun Channel Unit>.doWithSuspending( action: ActorAction ) = suspendCoroutine { trySend { safely({ e -> it.resumeWithException(e) }) { it.resume(action()) } } }