blob: be8abcc5b66419568cff6b0f0ff3a9ba15e9a865 (
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
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
|
(defpackage :gtwiwtg-test
(:use :cl :gtwiwtg :prove))
(in-package :gtwiwtg-test)
(defmacro autoplan (&rest test-forms)
`(progn
(plan ,(length test-forms))
,@test-forms
(finalize)))
(autoplan
(is (take 4 (range)) '(0 1 2 3))
(is (collect (range :from 2 :to -1 :by -0.5))
'(2.0 1.5 1.0 0.5 0.0 -0.5))
(is (collect (range :from 2 :to -1 :by -0.5 :inclusive t))
'(2.0 1.5 1.0 0.5 0.0 -0.5 -1.0))
(ok (let ((r (range)))
(take 1 r)
(gtwiwtg::stopped-p r)))
(ok (not (gtwiwtg::stopped-p (range))))
(is '(4 5 6) (collect (seq '(1 2 3 4 5 6) :start 3)))
(is (collect (filter! (complement #'alpha-char-p) (seq "1234abcd5e6f")))
'(#\1 #\2 #\3 #\4 #\5 #\6))
(is '(1 2 3 5 8 13)
(take 6 (from-recurrence #'+ 1 0)))
(let ((s (open (asdf:system-source-file "gtwiwtg-test"))))
(size (from-input-stream s (lambda (s) (read-line s nil nil))))
(ok (not (open-stream-p s))))
(let* ((file (asdf:system-source-file "gtwiwtg-test"))
(stat (osicat-posix:stat file)))
(is (osicat-posix:stat-size stat)
(1- (size (file-bytes file))))) ;; b/c NIL is returned as the last generated value
(let* ((file (asdf:system-source-file "gtwiwtg-test"))
(stat (osicat-posix:stat file)))
(is (osicat-posix:stat-size stat)
(1- (size (file-chars file)))))
(is (list 10 20 30 40)
(take 4 (map! (lambda (x) (* x 10))
(range :from 1))))
(is (list 20 40 60 80 100)
(take 5 (map! (lambda (x) (* 10 x))
(filter! #'evenp (range :from 1)))))
(is (list 0 1 2 3 #\a #\b #\c -10 -20 -30)
(take 10 (concat! (times 4)
(seq "abc")
(range :from -10 :by -10))))
(is '(("one" 1 :one) ("two" 2 :two) ("three" 3 :three))
(collect (zip! (seq '("one" "two" "three"))
(range :from 1)
(repeater :one :two :three))))
(is '(-200 -180 -160 -140 -120 -100 -80 -60 -40 -20 -20 -15 -10 -5 0 0 1 2 3 4 5 6 7
8 9 20 40 60 80 100 120 140 160 180 200)
(collect
(merge! #'<
(range :from -200 :by 20 :to 200 :inclusive t)
(times 10)
(range :from -20 :by 5 :to 0))))
(is (collect
(merge! #'<
(times 3)
(range :from -200 :by 50 :to 200 :inclusive t)
(range :from 0 :by -5 :to -20 :inclusive t)))
'(-200 -150 -100 -50 -20 -15 -10 -5 0 0 0 1 2 50 100 150 200))
;; don't be fooled by the last example. Merge is only guaranteed to
;; produce sorted outputs if the inputs are all sorted the same way.
;; here is an example showing that the end result isn't always sorted
;; if the arguments are sorted in different ways:
(is (collect
(merge! #'<
(times 3)
(range :from 200 :by -50 :to -200 :inclusive t)
(range :from 0 :by -5 :to -20 :inclusive t)))
'(0 -5 -10 -15 -20 -50 -100 -150 -200 0 0 1 2 50 100 150 200))
(is (concatenate 'string (collect (skip! 5 (seq "hellodude"))))
"dude")
(is (take 4 (skip! 10 (range)))
'(10 11 12 13))
(is (collect (skip-while! #'evenp (seq '(0 2 4 6 9 2 4 6 7 11))))
'(9 2 4 6 7 11))
(destructuring-bind (a b c d) (nfurcate! 4 (seq "hello"))
(is (concatenate 'string
(collect a)
(collect b)
(collect c)
(collect d))
"hellohellohellohello"))
(destructuring-bind (a b c d) (nfurcate! 4 (seq "hello"))
(is (concatenate 'string
(collect (intersperse! a b c d)))
"hhhheeeelllllllloooo"))
(destructuring-bind (a b c d) (disperse! 4 (seq "hhhheeeelllllllloooo"))
(is (concatenate 'string
(collect (concat! a b c d)))
"hellohellohellohello"))
)
|