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
(sort IVec (Vec i64))
; Test vec-of
(check (= (vec-of 1 2) (vec-push (vec-push (vec-empty) 1) 2)))
; Test vec-append
(check (= (vec-append (vec-of 1 2) (vec-of 3 4)) (vec-of 1 2 3 4)))
; Test vec-pop
(check (= (vec-pop (vec-of 1 2 3)) (vec-of 1 2)))
; Regression: inline checks must not alias different vec-of arities.
(check (= (vec-of 1 2) (vec-pop (vec-of 1 2 3))))
; Test vec-not-contains
(check (vec-not-contains (vec-of 1 2 3) 4))
; Test vec-contains
(check (vec-contains (vec-of 1 2 3) 2))
; Test length
(check (= (vec-length (vec-of 1 2 3)) 3))
; Test vec-get
(check (= (vec-get (vec-of 1 2 3) 1) 2))
; Test vec-set
(check (= (vec-set (vec-of 1 2 3) 1 4) (vec-of 1 4 3)))
; Test rebuilding
(sort X)
(sort VX (Vec X))
(constructor a () X)
(constructor b () X)
(let $p (vec-of (a)))
(let $q (vec-of (b)))
(check (!= $p $q))
(push)
(union (a) (b))
(check (= $p $q))
(pop)
; Test union
(push)
(vec-union $p $q)
(check (= $p $q))
(check (= (a) (b)))
(pop)
; test union fails on different lengths
(fail (vec-union (vec-of (a)) (vec-of (b) (a))))
; verify vec-union works as merge function
(function ff () VX :merge (vec-union old new))
(push)
(set (ff) $p)
(set (ff) $q)
(check (= $p $q))
(check (= (a) (b)))
(pop)
; range
(check (= (vec-range 5) (vec-of 0 1 2 3 4)))
; Test unstable-vec-map
(sort Y)
(sort VY (Vec Y))
(sort XY (UnstableFn (X) Y))
(constructor y (X) Y)
(push)
(let $mapped (unstable-vec-map (unstable-fn "y") (vec-of (a) (b))))
(check (= $mapped (vec-of (y (a)) (y (b)))))
(pop)
; Verify that it skips on undefined
(function xToY (X) Y :no-merge)
(set (xToY (a)) (y (a)))
(let $mapped (unstable-vec-map (unstable-fn "xToY") (vec-of (a) )))
(check (= $mapped (vec-of (y (a)) )))
(check (= (unstable-vec-map (unstable-fn "xToY") (vec-of (a) (b) )) (vec-of (y (a)) )))