blob: 2f259a0ea0296a299d45e483ca8c16fc257f5338 (
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
enum Job(Increment(x:Int), Decrement(x:Int))
func main():
do:
>> channel := |:Int|
>> channel:give(10)
>> channel:give(20)
>> channel:give(30)
>> channel:view()
= [10, 20, 30]
>> channel:peek()
= 10
>> channel:peek(front=no)
= 30
>> channel:give(-10, front=yes)
>> channel:view()
= [-10, 10, 20, 30]
jobs := |:Job; max_size=2|
>> jobs:give(Increment(5))
>> jobs:peek()
= Job.Increment(x=5)
results := |:Int; max_size|
>> thread := Thread.new(func():
!! In another thread!
while yes:
>> got := jobs:get()
when got is Increment(x):
>> results:give(x+1)
is Decrement(x):
>> results:give(x-1)
)
>> jobs:give(Decrement(100))
>> jobs:give(Decrement(100))
>> jobs:give(Decrement(100))
>> jobs:give(Decrement(100))
>> jobs:give(Decrement(100))
>> jobs:give(Decrement(100))
>> results:get()
= 6
>> jobs:give(Increment(1000))
>> results:get()
= 99
>> results:get()
= 99
>> results:get()
= 99
>> results:get()
= 99
>> results:get()
= 99
>> results:get()
= 99
>> results:get()
= 1001
!! Canceling...
>> thread:cancel()
!! Joining...
>> thread:join()
!! Done!
|