-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2-emulate-async-calls.kt
More file actions
55 lines (41 loc) · 1.54 KB
/
2-emulate-async-calls.kt
File metadata and controls
55 lines (41 loc) · 1.54 KB
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package AsynchronousProgramming
import kotlinx.coroutines.*
typealias Errback<T> = (Error?, T) -> Unit
// Emulate asynchronous calls
private fun <T, K> wrapAsync(fn: (T, Errback<K>) -> Unit) = { args: T, cb: Errback<K> ->
GlobalScope.launch {
delay((Math.random() * 1000).toLong())
fn(args, cb)
}
}
// Asynchronous functions
private val readConfig = wrapAsync { name: String, cb: Errback<String> ->
println("(1) config loaded")
cb(null, name)
}
private val doQuery = wrapAsync { statement: String, cb: Errback<Map<String, String>> ->
println("(2) SQL query executed: $statement")
cb(null, mapOf("city" to "Kyiv", "univ" to "KPI"))
}
private val httpGet = wrapAsync { url: String, cb: Errback<String> ->
println("(3) Page retrieved: $url")
cb(null, "<html>Some archaic web here</html>")
}
private val readFile = wrapAsync { path: String, cb: Errback<String> ->
println("(4) File '$path' loaded")
cb(null, "file content")
}
private fun callbackCounter(count: Int, cb: () -> Unit): () -> Unit {
var counter = 0
return { if (++counter == count) cb() }
}
private val callback = callbackCounter(4) { println("All done!") }
private fun main() = runBlocking {
println("start")
val job1 = readConfig("myConfig") { _, _ -> callback() }
val job2 = doQuery("select * from cities") { _, _ -> callback() }
val job3 = httpGet("http://kpi.ua") { _, _ -> callback() }
val job4 = readFile("2-emulate-async-calls.kt") { _, _ -> callback() }
joinAll(job1, job2, job3, job4)
println("end")
}