raulraja
04/23/2018, 12:33 AMinterface Service<F> {
fun applicative(): Applicative<F>
fun fetchOne(): Kind<F, Int>
fun fetchTwo(): Kind<F, Int>
fun fetchSum(): Kind<F, Int> = with(applicative()) {
map(fetchOne(), fetchTwo(), { one, two -> one + two })
}
}
@instance(DeferredK::class)
interface DeferredServiceInstance : Service<ForDeferredK> {
fun applicative(): Applicative<ForDeferredK> = DeferredK.applicative()
override fun fetchOne(): DeferredK<Int> = async { 1 }.k()
override fun fetchTwo(): DeferredK<Int> = async { 2 }.k()
}
DeferredK.service().fetchAll() // Deferred(3)