Marcin Gryszko
09/24/2020, 5:07 PMfun <F> Applicative<F>.combine(
    fn1: () -> Kind<F, Any>,
    fn2: () -> Kind<F, Any>
): Kind<F, Any> =
    fn1().map2(fn2) { (a, b) ->
        // do sth with a and b
    }eithersuspend fun combine(
    fn1: suspend () -> Either<Throwable, Any>,
    fn2: suspend () -> Either<Throwable, Any>
): Either<F, Any> =
    either {
        val a = !fn1()
        val b = !fn2()
        // do sth with a and b
    }parMapNEitherparMapN(fn1, fn2) { a, b ->
        // Compile error: Suspension functions can be called only within coroutine body
        either {
            // same code as in the sequential example
        }
    }parMapNraulraja
09/24/2020, 7:22 PMraulraja
09/24/2020, 7:23 PMMarcin Gryszko
09/24/2020, 7:24 PMparMapNsuspendparMapN(fa: suspend () -> A, fb: suspend () -> B, f: (A, B) -> C)Marcin Gryszko
09/24/2020, 7:25 PMarrow.fx.coroutinesraulraja
09/24/2020, 7:26 PMraulraja
09/24/2020, 7:27 PMMarcin Gryszko
09/24/2020, 8:04 PMeither { 
        parMapN(fn1, fn2) { a, b -> 
            val aUnwrapped = !a // Compile error: Suspension functions can be called only within coroutine body
        }
    }parMapsuspendparMapN(fa: suspend () -> A, fb: suspend () -> B, suspend f: (A, B) -> C)raulraja
09/24/2020, 10:02 PMraulraja
09/24/2020, 10:04 PM