Pedro Silva
09/20/2019, 9:40 AMclass ForCompletionStage private constructor() { companion object }
typealias CompletionStageFor<V> = Kind<ForCompletionStage, V>
data class CompletionStageOf<V>(val fut: CompletionStage<V>) : CompletionStageFor<V>
@Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE")
inline fun <A> CompletionStageFor<A>.fix(): CompletionStageOf<A> = this as CompletionStageOf<A>
interface CompletionStageMonad : Monad<ForCompletionStage> {
companion object {}
override fun <A, B> Kind<ForCompletionStage, A>.flatMap(f: (A) -> Kind<ForCompletionStage, B>): Kind<ForCompletionStage, B> {
val x1: CompletionStageOf<A> = this.fix()
val x2: CompletionStage<A> = x1.fut
val x3: CompletionStage<B> = x2.thenCompose { f(it).fix().fut }
val x4: Kind<ForCompletionStage, CompletionStage<B>> = just(x3)
// ...
}
}