arrow-fx / arrow.fx / IORace / raceN
open fun <A, B> raceN(ioA:
IOOf
<A>, ioB:
IOOf
<B>):
IO
<
Race2
<A, B>>
open fun <A, B, C> raceN(ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>):
IO
<
Race3
<out A, out B, out C>>
open fun <A, B, C, D> raceN(ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>):
IO
<
Race4
<out A, out B, out C, out D>>
open fun <A, B, C, D, E> raceN(ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>):
IO
<
Race5
<out A, out B, out C, out D, out E>>
open fun <A, B, C, D, E, F> raceN(ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>, ioF:
IOOf
<F>):
IO
<
Race6
<out A, out B, out C, out D, out E, out F>>
open fun <A, B, C, D, E, F, G> raceN(ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>, ioF:
IOOf
<F>, ioG:
IOOf
<G>):
IO
<
Race7
<out A, out B, out C, out D, out E, out F, out G>>
open fun <A, B, C, D, E, F, G, H> raceN(ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>, ioF:
IOOf
<F>, ioG:
IOOf
<G>, ioH:
IOOf
<H>):
IO
<
Race8
<out A, out B, out C, out D, out E, out F, out G, out H>>
open fun <A, B, C, D, E, F, G, H, I> raceN(ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>, ioF:
IOOf
<F>, ioG:
IOOf
<G>, ioH:
IOOf
<H>, ioI:
IOOf
<I>):
IO
<
Race9
<out A, out B, out C, out D, out E, out F, out G, out H, out I>>
open fun <A, B> raceN(ctx:
CoroutineContext
, ioA:
IOOf
<A>, ioB:
IOOf
<B>):
IO
<
Race2
<A, B>>
Race two tasks concurrently within a new IO on this@raceN. At the end of the race it automatically cancels the loser.
import arrow.Kind
import arrow.fx.*
import arrow.fx.typeclasses.Concurrent
import kotlinx.coroutines.Dispatchers
import arrow.fx.extensions.io.concurrent.concurrent
fun main(args: Array<String>) {
fun <F> Concurrent<F>.example(): Kind<F, String> {
val never: Kind<F, Int> = cancellable { effect { println("Never got cancelled for losing.") } }
//sampleStart
val result = fx.concurrent {
val eitherGetOrUnit = !Dispatchers.Default.raceN(never, just(5))
eitherGetOrUnit.fold(
{ "Never always loses race" },
{ i -> "Race was won with $i" }
)
}
//sampleEnd
return result
}
IO.concurrent().example().fix().unsafeRunSync().let(::println)
}
ctx
- CoroutineContext to execute the source IO on.
ioA
- task to participate in the race
ioB
- task to participate in the race
Return IO either Left if ioA won the race, or Right if ioB won the race.
See Also
open fun <A, B, C> raceN(ctx:
CoroutineContext
, ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>):
IO
<
Race3
<out A, out B, out C>>
open fun <A, B, C, D> raceN(ctx:
CoroutineContext
, ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>):
IO
<
Race4
<out A, out B, out C, out D>>
open fun <A, B, C, D, E> raceN(ctx:
CoroutineContext
, ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>):
IO
<
Race5
<out A, out B, out C, out D, out E>>
open fun <A, B, C, D, E, F> raceN(ctx:
CoroutineContext
, ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>, ioF:
IOOf
<F>):
IO
<
Race6
<out A, out B, out C, out D, out E, out F>>
open fun <A, B, C, D, E, F, G> raceN(ctx:
CoroutineContext
, ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>, ioF:
IOOf
<F>, ioG:
IOOf
<G>):
IO
<
Race7
<out A, out B, out C, out D, out E, out F, out G>>
open fun <A, B, C, D, E, F, G, H> raceN(ctx:
CoroutineContext
, ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>, ioF:
IOOf
<F>, ioG:
IOOf
<G>, ioH:
IOOf
<H>):
IO
<
Race8
<out A, out B, out C, out D, out E, out F, out G, out H>>
open fun <A, B, C, D, E, F, G, H, I> raceN(ctx:
CoroutineContext
, ioA:
IOOf
<A>, ioB:
IOOf
<B>, ioC:
IOOf
<C>, ioD:
IOOf
<D>, ioE:
IOOf
<E>, ioF:
IOOf
<F>, ioG:
IOOf
<G>, ioH:
IOOf
<H>, ioI:
IOOf
<I>):
IO
<
Race9
<out A, out B, out C, out D, out E, out F, out G, out H, out I>>
See Also
Do you like Arrow?
✖