-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2-stateless.kt
More file actions
36 lines (28 loc) · 931 Bytes
/
Copy path2-stateless.kt
File metadata and controls
36 lines (28 loc) · 931 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package Future
import kotlin.math.pow
interface ChainableFuture<T>: Future<T> {
fun chain(fn: (T) -> Future<T>): ChainableFuture<T>
}
private fun <T> future(executor: (resolve: (T) -> Unit) -> Unit): ChainableFuture<T> = object : ChainableFuture<T> {
override fun chain(fn: (T) -> Future<T>) = future<T> { resolve ->
fork { value -> fn(value).fork(resolve) }
}
override fun map(fn: (T) -> T) = chain { futureOf(fn(it)) }
override fun fork(succedeed: (T) -> Unit): ChainableFuture<T> {
executor(succedeed)
return this
}
}
private fun <T> futureOf(value: T) = future<T> { it(value) }
// Usage
private fun main() {
val future1 = future<Int> { it(5) }
.map {
println("future1 started")
it
}
.map { it + 1 }
.map { it.toDouble().pow(3.0).toInt() }
.fork { println("future1 result: $it") }
println(future1)
}