summaryrefslogtreecommitdiff
path: root/shared_counter.kpl
blob: 0be8c247f1efef7a13ff7f7f6abc99e56531fb37 (plain)
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

// Notice how counter can only be modified as read as [c]

counter : `shared 0

inc_dec :([amount]
    header : `const `format "WHITE#Counter:# "
    body : ^ counter {[c]
        c +: amount
        ? {
            amount = 1 { "#GREEN#%#" `format c }
            amount = -1 { "#RED#%#" `format c }
            { "INVALID" }
        }
    }
    `log ,(header; body; "\n")
)

inc : inc_dec `bind 1
dec : inc_dec `bind -1

actions : `const 1_000

batch : `const 100

runner : ([fn]
    total : actions
    @ total {
        `log "#BOLD#WHITE#Batch: #CYAN#% #MAGENTA#%#\n" `format (fn; total)
        v : Vector[`async_type fn] $ ()
        @ 1 .. batch { v `push `async fn }
        @ v {[x] `await x }
        total -: batch
    }
)

i : runner `async inc
d : runner `async dec

`use "time" [Seconds]
`use "sys" [sleep]

sleep `sync Seconds $ 1

`await (d; i)

`log ^ counter {[c]
    ? !c {
        `format "#BOLD#GREEN#VALID#\n"
    } {
        `format "#BOLD#RED#INVALID#\n"
    }
}