Youssef Shoaib [MOD]
11/16/2024, 5:58 PMpublic suspend inline fun <A, B, C> parZip(
crossinline fa: suspend () -> A,
crossinline fb: suspend () -> B,
crossinline f: suspend (A, B) -> C
): C {
contract {
callsInPlace(fa, InvocationKind.EXACTLY_ONCE)
callsInPlace(fb, InvocationKind.EXACTLY_ONCE)
callsInPlace(f, InvocationKind.EXACTLY_ONCE)
}
return coroutineScope {
val faa = async { fa() }
val fbb = async { fb() }
val (a, b) = awaitAll(faa, fbb)
f(a as A, b as B)
}
}
Of course the compiler rejects them, that's not my question. Are the semantics of contracts valid for this case, so that I can just suppress the warnings, or is there a case where this contract can be violated by the behaviour of parZip
?
My thinking is that, because of the awaitAll
and the coroutineScope
, any effect that fa
and fb
have are guaranteed to be finished by the end of parZip
, and hence that they are guaranteed to be invoked and finish invocation and throw all their exceptions and everything. Is my thinking correct? Could there be a strange cancellation scenario here that violates this contract?ephemient
11/16/2024, 8:52 PMthe compiler rejects themit does? compiles fine for me
Youssef Shoaib [MOD]
11/16/2024, 8:53 PMLEAKED_IN_PLACE_LAMBDA
and WRONG_INVOCATION_KIND
. This is K2 only I think. I should've clarified I meant that it emits warnings, and thus my question is should we suppress those warnings for this function, and in fact what is the most apt contract for this function?