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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
func main()
do
nums : [Num32] = []
assert nums == []
do
nums : [Num32]
assert nums == []
do
list := [10, 20, 30]
assert list == [10, 20, 30]
assert list[1] == 10
assert list[-1] == 30
assert list.length == 3
sum := 0
for x in list
sum += x
assert sum == 60
str := ""
for i,x in list
str ++= "($i,$x)"
assert str == "(1,10)(2,20)(3,30)"
do
list := [10, 20] ++ [30, 40]
assert list == [10, 20, 30, 40]
>> list ++= [50, 60]
assert list == [10, 20, 30, 40, 50, 60]
do
>> list := [10, 20]
>> copy := list
>> list ++= [30]
assert list == [10, 20, 30]
assert copy == [10, 20]
do
assert [10*i for i in 5] == [10, 20, 30, 40, 50]
assert [i*10 for i in 5] == [10, 20, 30, 40, 50]
assert [i*10 for i in 5 if i mod 2 != 0] == [10, 30, 50]
assert [x for x in y if x > 1 for y in [3, 4, 5] if y < 5] == [2, 3, 2, 3, 4]
do
>> list := @[10, 20]
>> copy := list[]
>> list.insert(30)
assert list[] == [10, 20, 30]
assert copy == [10, 20]
>> list[1] = 999
assert list[] == [999, 20, 30]
do
>> list := &[10, 20, 30]
reversed := list.reversed()
assert reversed == [30, 20, 10]
# Ensure the copy-on-write behavior triggers:
>> list[1] = 999
assert reversed == [30, 20, 10]
do
>> nums := @[10, -20, 30]
# Sorted function doesn't mutate original:
assert nums.sorted() == [-20, 10, 30]
assert nums[] == [10, -20, 30]
# Sort function does mutate in place:
>> nums.sort()
assert nums[] == [-20, 10, 30]
# Custom sort functions:
>> nums.sort(func(x,y:&Int) x.abs() <> y.abs())
assert nums[] == [10, -20, 30]
>> nums.sort(func(x,y:&Int) y[] <> x[])
assert nums[] == [30, 10, -20]
>> ["A", "B", "C"].sample(10, [1.0, 0.5, 0.0])
do
>> heap := @[(i * 1337) mod 37 for i in 10]
>> heap.heapify()
>> heap
heap_order : @[Int]
repeat
heap_order.insert(heap.heap_pop() or stop)
assert heap_order[] == heap_order.sorted()
heap_order[] = []
for i in 10
heap.heap_push((i*13337) mod 37)
>> heap
repeat
heap_order.insert(heap.heap_pop() or stop)
assert heap_order[] == heap_order.sorted()
do
assert [i*10 for i in 5].from(3) == [30, 40, 50]
assert [i*10 for i in 5].to(3) == [10, 20, 30]
assert [i*10 for i in 5].to(-2) == [10, 20, 30, 40]
assert [i*10 for i in 5].from(-2) == [40, 50]
assert [i*10 for i in 5].by(2) == [10, 30, 50]
assert [i*10 for i in 5].by(-1) == [50, 40, 30, 20, 10]
assert [10, 20, 30, 40].by(2) == [10, 30]
assert [10, 20, 30, 40].by(-2) == [40, 20]
assert [i*10 for i in 10].by(2).by(2) == [10, 50, 90]
assert [i*10 for i in 10].by(2).by(-1) == [90, 70, 50, 30, 10]
# Test iterating over list.from() and list.to()
xs := ["A", "B", "C", "D"]
for i,x in xs.to(-2)
for y in xs.from(i+1)
say("$(x)$(y)")
do
>> nums := @[-7, -4, -1, 2, 5]
>> nums.sort()
assert [nums.binary_search(i) for i in nums[]] == [1, 2, 3, 4, 5]
>> nums.sort(func(a,b:&Int) a.abs() <> b.abs())
assert [nums.binary_search(i, func(a,b:&Int) a.abs() <> b.abs()) for i in nums[]] == [1, 2, 3, 4, 5]
assert ["a", "b", "c"].find("b") == 2
assert ["a", "b", "c"].find("XXX") == none
assert [10, 20].where(func(i:&Int) i.is_prime()) == none
assert [4, 5, 6].where(func(i:&Int) i.is_prime()) == 2
do
>> nums := &[10, 20, 30, 40, 50]
assert nums.pop() == 50
assert nums[] == [10, 20, 30, 40]
assert nums.pop(2) == 20
assert nums[] == [10, 30, 40]
>> nums.clear()
assert nums[] == []
assert nums.pop() == none
assert [1,2,1,2,3].unique() == {1,2,3}
|