@grain/stdlib 0.4.4 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/array.gr +76 -57
- package/buffer.gr +7 -4
- package/bytes.gr +10 -10
- package/char.gr +112 -56
- package/char.md +200 -0
- package/hash.gr +17 -13
- package/list.gr +78 -61
- package/map.gr +106 -110
- package/number.gr +25 -7
- package/number.md +34 -0
- package/option.gr +25 -25
- package/package.json +1 -1
- package/pervasives.gr +32 -20
- package/queue.gr +4 -1
- package/range.gr +26 -26
- package/runtime/dataStructures.gr +28 -29
- package/runtime/debug.gr +0 -1
- package/runtime/equal.gr +37 -16
- package/runtime/exception.gr +28 -15
- package/runtime/gc.gr +31 -18
- package/runtime/malloc.gr +19 -11
- package/runtime/numberUtils.gr +208 -105
- package/runtime/numbers.gr +217 -118
- package/runtime/string.gr +98 -39
- package/runtime/stringUtils.gr +6 -2
- package/runtime/unsafe/conv.gr +10 -10
- package/runtime/unsafe/memory.gr +14 -3
- package/runtime/unsafe/printWasm.gr +4 -4
- package/runtime/unsafe/tags.gr +2 -2
- package/runtime/unsafe/wasmf32.gr +9 -2
- package/runtime/unsafe/wasmf64.gr +9 -2
- package/runtime/unsafe/wasmi32.gr +65 -47
- package/runtime/unsafe/wasmi64.gr +78 -50
- package/runtime/wasi.gr +199 -45
- package/set.gr +111 -116
- package/stack.gr +26 -26
- package/string.gr +273 -119
- package/sys/file.gr +356 -177
- package/sys/process.gr +10 -6
- package/sys/random.gr +3 -6
- package/sys/time.gr +3 -3
package/set.gr
CHANGED
|
@@ -10,12 +10,12 @@ import { hash } from "hash"
|
|
|
10
10
|
|
|
11
11
|
record Bucket<t> {
|
|
12
12
|
mut key: t,
|
|
13
|
-
mut next: Option<Bucket<t
|
|
13
|
+
mut next: Option<Bucket<t>>,
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
record Set<k> {
|
|
17
17
|
mut size: Number,
|
|
18
|
-
mut buckets: Array<Option<Bucket<k
|
|
18
|
+
mut buckets: Array<Option<Bucket<k>>>,
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
// TODO: This could take an `eq` function to custom comparisons
|
|
@@ -27,12 +27,9 @@ record Set<k> {
|
|
|
27
27
|
*
|
|
28
28
|
* @since 0.3.0
|
|
29
29
|
*/
|
|
30
|
-
export let makeSized =
|
|
31
|
-
let buckets = Array.make(storageLength, None)
|
|
32
|
-
{
|
|
33
|
-
size: 0,
|
|
34
|
-
buckets
|
|
35
|
-
}
|
|
30
|
+
export let makeSized = storageLength => {
|
|
31
|
+
let buckets = Array.make(storageLength, None)
|
|
32
|
+
{ size: 0, buckets }
|
|
36
33
|
}
|
|
37
34
|
/**
|
|
38
35
|
* Creates a new, empty set.
|
|
@@ -46,8 +43,8 @@ export let make = () => {
|
|
|
46
43
|
}
|
|
47
44
|
|
|
48
45
|
let getBucketIndex = (key, buckets) => {
|
|
49
|
-
let bucketsLength = Array.length(buckets)
|
|
50
|
-
let hashedKey = hash(key)
|
|
46
|
+
let bucketsLength = Array.length(buckets)
|
|
47
|
+
let hashedKey = hash(key)
|
|
51
48
|
hashedKey % bucketsLength
|
|
52
49
|
}
|
|
53
50
|
|
|
@@ -55,45 +52,45 @@ let rec copyNodeWithNewHash = (oldNode, next, tail) => {
|
|
|
55
52
|
match (oldNode) {
|
|
56
53
|
None => void,
|
|
57
54
|
Some(node) => {
|
|
58
|
-
let idx = getBucketIndex(node.key, next)
|
|
59
|
-
let newNode = Some(node)
|
|
55
|
+
let idx = getBucketIndex(node.key, next)
|
|
56
|
+
let newNode = Some(node)
|
|
60
57
|
match (tail[idx]) {
|
|
61
58
|
None => {
|
|
62
|
-
next[idx] = newNode
|
|
59
|
+
next[idx] = newNode
|
|
63
60
|
},
|
|
64
61
|
Some(tailNode) => {
|
|
65
62
|
// If there's already a tail node, we add this to the end
|
|
66
|
-
tailNode.next = newNode
|
|
67
|
-
}
|
|
63
|
+
tailNode.next = newNode
|
|
64
|
+
},
|
|
68
65
|
}
|
|
69
66
|
// Always place this node as the new tail
|
|
70
|
-
tail[idx] = newNode
|
|
67
|
+
tail[idx] = newNode
|
|
71
68
|
// Recurse with the next node
|
|
72
|
-
copyNodeWithNewHash(node.next, next, tail)
|
|
73
|
-
}
|
|
69
|
+
copyNodeWithNewHash(node.next, next, tail)
|
|
70
|
+
},
|
|
74
71
|
}
|
|
75
72
|
}
|
|
76
73
|
|
|
77
|
-
let resize =
|
|
78
|
-
let currentBuckets = set.buckets
|
|
79
|
-
let currentSize = Array.length(currentBuckets)
|
|
80
|
-
let nextSize = currentSize * 2
|
|
74
|
+
let resize = set => {
|
|
75
|
+
let currentBuckets = set.buckets
|
|
76
|
+
let currentSize = Array.length(currentBuckets)
|
|
77
|
+
let nextSize = currentSize * 2
|
|
81
78
|
if (nextSize >= currentSize) {
|
|
82
|
-
let nextBuckets = Array.make(nextSize, None)
|
|
79
|
+
let nextBuckets = Array.make(nextSize, None)
|
|
83
80
|
// This tracks the tail nodes so we can set their `next` to None
|
|
84
|
-
let tailNodes = Array.make(nextSize, None)
|
|
85
|
-
set.buckets = nextBuckets
|
|
86
|
-
Array.forEach(
|
|
87
|
-
copyNodeWithNewHash(old, nextBuckets, tailNodes)
|
|
88
|
-
}, currentBuckets)
|
|
89
|
-
Array.forEach(
|
|
81
|
+
let tailNodes = Array.make(nextSize, None)
|
|
82
|
+
set.buckets = nextBuckets
|
|
83
|
+
Array.forEach(old => {
|
|
84
|
+
copyNodeWithNewHash(old, nextBuckets, tailNodes)
|
|
85
|
+
}, currentBuckets)
|
|
86
|
+
Array.forEach(tail => {
|
|
90
87
|
match (tail) {
|
|
91
88
|
None => void,
|
|
92
89
|
Some(node) => {
|
|
93
|
-
node.next = None
|
|
94
|
-
}
|
|
90
|
+
node.next = None
|
|
91
|
+
},
|
|
95
92
|
}
|
|
96
|
-
}, tailNodes)
|
|
93
|
+
}, tailNodes)
|
|
97
94
|
} else {
|
|
98
95
|
void
|
|
99
96
|
}
|
|
@@ -105,7 +102,7 @@ let rec nodeInBucket = (key, node) => {
|
|
|
105
102
|
} else {
|
|
106
103
|
match (node.next) {
|
|
107
104
|
None => false,
|
|
108
|
-
Some(next) => nodeInBucket(key, next)
|
|
105
|
+
Some(next) => nodeInBucket(key, next),
|
|
109
106
|
}
|
|
110
107
|
}
|
|
111
108
|
}
|
|
@@ -119,24 +116,24 @@ let rec nodeInBucket = (key, node) => {
|
|
|
119
116
|
* @since 0.3.0
|
|
120
117
|
*/
|
|
121
118
|
export let add = (key, set) => {
|
|
122
|
-
let buckets = set.buckets
|
|
119
|
+
let buckets = set.buckets
|
|
123
120
|
let idx = getBucketIndex(key, buckets)
|
|
124
|
-
let bucket = buckets[idx]
|
|
121
|
+
let bucket = buckets[idx]
|
|
125
122
|
match (bucket) {
|
|
126
123
|
None => {
|
|
127
|
-
buckets[idx] = Some({ key, next: None })
|
|
128
|
-
set.size = incr(set.size)
|
|
124
|
+
buckets[idx] = Some({ key, next: None })
|
|
125
|
+
set.size = incr(set.size)
|
|
129
126
|
},
|
|
130
127
|
Some(node) => {
|
|
131
128
|
if (!nodeInBucket(key, node)) {
|
|
132
|
-
buckets[idx] = Some({ key, next: bucket })
|
|
133
|
-
set.size = incr(set.size)
|
|
134
|
-
}
|
|
135
|
-
}
|
|
129
|
+
buckets[idx] = Some({ key, next: bucket })
|
|
130
|
+
set.size = incr(set.size)
|
|
131
|
+
}
|
|
132
|
+
},
|
|
136
133
|
}
|
|
137
134
|
// Resize if there are more than 2x the amount of nodes as buckets
|
|
138
|
-
if (set.size >
|
|
139
|
-
resize(set)
|
|
135
|
+
if (set.size > Array.length(buckets) * 2) {
|
|
136
|
+
resize(set)
|
|
140
137
|
} else {
|
|
141
138
|
void
|
|
142
139
|
}
|
|
@@ -152,12 +149,12 @@ export let add = (key, set) => {
|
|
|
152
149
|
* @since 0.3.0
|
|
153
150
|
*/
|
|
154
151
|
export let contains = (key, set) => {
|
|
155
|
-
let buckets = set.buckets
|
|
156
|
-
let idx = getBucketIndex(key, buckets)
|
|
157
|
-
let bucket = buckets[idx]
|
|
152
|
+
let buckets = set.buckets
|
|
153
|
+
let idx = getBucketIndex(key, buckets)
|
|
154
|
+
let bucket = buckets[idx]
|
|
158
155
|
match (bucket) {
|
|
159
156
|
None => false,
|
|
160
|
-
Some(node) => nodeInBucket(key, node)
|
|
157
|
+
Some(node) => nodeInBucket(key, node),
|
|
161
158
|
}
|
|
162
159
|
}
|
|
163
160
|
|
|
@@ -166,12 +163,12 @@ let rec removeInBucket = (key, node) => {
|
|
|
166
163
|
None => false,
|
|
167
164
|
Some(next) => {
|
|
168
165
|
if (key == next.key) {
|
|
169
|
-
node.next = next.next
|
|
166
|
+
node.next = next.next
|
|
170
167
|
true
|
|
171
168
|
} else {
|
|
172
169
|
removeInBucket(key, next)
|
|
173
170
|
}
|
|
174
|
-
}
|
|
171
|
+
},
|
|
175
172
|
}
|
|
176
173
|
}
|
|
177
174
|
|
|
@@ -184,22 +181,22 @@ let rec removeInBucket = (key, node) => {
|
|
|
184
181
|
* @since 0.3.0
|
|
185
182
|
*/
|
|
186
183
|
export let remove = (key, set) => {
|
|
187
|
-
let buckets = set.buckets
|
|
188
|
-
let idx = getBucketIndex(key, buckets)
|
|
189
|
-
let bucket = buckets[idx]
|
|
184
|
+
let buckets = set.buckets
|
|
185
|
+
let idx = getBucketIndex(key, buckets)
|
|
186
|
+
let bucket = buckets[idx]
|
|
190
187
|
match (bucket) {
|
|
191
188
|
None => void,
|
|
192
189
|
Some(node) => {
|
|
193
190
|
// If it is a top-level node, just replace with next node
|
|
194
191
|
if (key == node.key) {
|
|
195
|
-
set.size = decr(set.size)
|
|
196
|
-
buckets[idx] = node.next
|
|
192
|
+
set.size = decr(set.size)
|
|
193
|
+
buckets[idx] = node.next
|
|
197
194
|
} else {
|
|
198
195
|
if (removeInBucket(key, node)) {
|
|
199
|
-
set.size = decr(set.size)
|
|
196
|
+
set.size = decr(set.size)
|
|
200
197
|
}
|
|
201
198
|
}
|
|
202
|
-
}
|
|
199
|
+
},
|
|
203
200
|
}
|
|
204
201
|
}
|
|
205
202
|
|
|
@@ -211,7 +208,7 @@ export let remove = (key, set) => {
|
|
|
211
208
|
*
|
|
212
209
|
* @since 0.3.0
|
|
213
210
|
*/
|
|
214
|
-
export let size =
|
|
211
|
+
export let size = set => {
|
|
215
212
|
set.size
|
|
216
213
|
}
|
|
217
214
|
|
|
@@ -223,7 +220,7 @@ export let size = (set) => {
|
|
|
223
220
|
*
|
|
224
221
|
* @since 0.3.0
|
|
225
222
|
*/
|
|
226
|
-
export let isEmpty =
|
|
223
|
+
export let isEmpty = set => {
|
|
227
224
|
size(set) == 0
|
|
228
225
|
}
|
|
229
226
|
|
|
@@ -234,21 +231,21 @@ export let isEmpty = (set) => {
|
|
|
234
231
|
*
|
|
235
232
|
* @since 0.3.0
|
|
236
233
|
*/
|
|
237
|
-
export let clear =
|
|
238
|
-
set.size = 0
|
|
239
|
-
let buckets = set.buckets
|
|
234
|
+
export let clear = set => {
|
|
235
|
+
set.size = 0
|
|
236
|
+
let buckets = set.buckets
|
|
240
237
|
Array.forEachi((bucket, idx) => {
|
|
241
|
-
buckets[idx] = None
|
|
242
|
-
}, buckets)
|
|
238
|
+
buckets[idx] = None
|
|
239
|
+
}, buckets)
|
|
243
240
|
}
|
|
244
241
|
|
|
245
242
|
let rec forEachBucket = (fn, node) => {
|
|
246
243
|
match (node) {
|
|
247
244
|
None => void,
|
|
248
245
|
Some({ key, next }) => {
|
|
249
|
-
fn(key)
|
|
250
|
-
forEachBucket(fn, next)
|
|
251
|
-
}
|
|
246
|
+
fn(key)
|
|
247
|
+
forEachBucket(fn, next)
|
|
248
|
+
},
|
|
252
249
|
}
|
|
253
250
|
}
|
|
254
251
|
|
|
@@ -261,17 +258,16 @@ let rec forEachBucket = (fn, node) => {
|
|
|
261
258
|
* @since 0.3.0
|
|
262
259
|
*/
|
|
263
260
|
export let forEach = (fn, set) => {
|
|
264
|
-
let buckets = set.buckets
|
|
265
|
-
Array.forEach(
|
|
261
|
+
let buckets = set.buckets
|
|
262
|
+
Array.forEach(bucket => {
|
|
266
263
|
forEachBucket(fn, bucket)
|
|
267
|
-
}, buckets)
|
|
264
|
+
}, buckets)
|
|
268
265
|
}
|
|
269
266
|
|
|
270
267
|
let rec reduceEachBucket = (fn, node, acc) => {
|
|
271
268
|
match (node) {
|
|
272
269
|
None => acc,
|
|
273
|
-
Some({ key, next }) =>
|
|
274
|
-
reduceEachBucket(fn, next, fn(acc, key))
|
|
270
|
+
Some({ key, next }) => reduceEachBucket(fn, next, fn(acc, key)),
|
|
275
271
|
}
|
|
276
272
|
}
|
|
277
273
|
|
|
@@ -286,11 +282,11 @@ let rec reduceEachBucket = (fn, node, acc) => {
|
|
|
286
282
|
* @since 0.3.0
|
|
287
283
|
*/
|
|
288
284
|
export let reduce = (fn, init, set) => {
|
|
289
|
-
let buckets = set.buckets
|
|
290
|
-
let mut acc = init
|
|
291
|
-
Array.forEach(
|
|
285
|
+
let buckets = set.buckets
|
|
286
|
+
let mut acc = init
|
|
287
|
+
Array.forEach(bucket => {
|
|
292
288
|
acc = reduceEachBucket(fn, bucket, acc)
|
|
293
|
-
}, buckets)
|
|
289
|
+
}, buckets)
|
|
294
290
|
acc
|
|
295
291
|
}
|
|
296
292
|
|
|
@@ -303,15 +299,14 @@ export let reduce = (fn, init, set) => {
|
|
|
303
299
|
* @since 0.3.0
|
|
304
300
|
*/
|
|
305
301
|
export let filter = (predicate, set) => {
|
|
306
|
-
let keysToRemove = reduce((list, key) =>
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}, keysToRemove);
|
|
302
|
+
let keysToRemove = reduce((list, key) => if (!predicate(key)) {
|
|
303
|
+
[key, ...list]
|
|
304
|
+
} else {
|
|
305
|
+
list
|
|
306
|
+
}, [], set)
|
|
307
|
+
List.forEach(key => {
|
|
308
|
+
remove(key, set)
|
|
309
|
+
}, keysToRemove)
|
|
315
310
|
}
|
|
316
311
|
|
|
317
312
|
/**
|
|
@@ -323,7 +318,7 @@ export let filter = (predicate, set) => {
|
|
|
323
318
|
* @since 0.3.0
|
|
324
319
|
*/
|
|
325
320
|
export let reject = (predicate, set) => {
|
|
326
|
-
filter(
|
|
321
|
+
filter(key => !predicate(key), set)
|
|
327
322
|
}
|
|
328
323
|
|
|
329
324
|
/**
|
|
@@ -334,7 +329,7 @@ export let reject = (predicate, set) => {
|
|
|
334
329
|
*
|
|
335
330
|
* @since 0.3.0
|
|
336
331
|
*/
|
|
337
|
-
export let toList =
|
|
332
|
+
export let toList = set => {
|
|
338
333
|
reduce((list, key) => [key, ...list], [], set)
|
|
339
334
|
}
|
|
340
335
|
|
|
@@ -346,11 +341,11 @@ export let toList = (set) => {
|
|
|
346
341
|
*
|
|
347
342
|
* @since 0.3.0
|
|
348
343
|
*/
|
|
349
|
-
export let fromList =
|
|
350
|
-
let set = make()
|
|
351
|
-
List.forEach(
|
|
352
|
-
add(key, set)
|
|
353
|
-
}, list)
|
|
344
|
+
export let fromList = list => {
|
|
345
|
+
let set = make()
|
|
346
|
+
List.forEach(key => {
|
|
347
|
+
add(key, set)
|
|
348
|
+
}, list)
|
|
354
349
|
set
|
|
355
350
|
}
|
|
356
351
|
|
|
@@ -362,7 +357,7 @@ export let fromList = (list) => {
|
|
|
362
357
|
*
|
|
363
358
|
* @since 0.3.0
|
|
364
359
|
*/
|
|
365
|
-
export let toArray =
|
|
360
|
+
export let toArray = set => {
|
|
366
361
|
Array.fromList(toList(set))
|
|
367
362
|
}
|
|
368
363
|
|
|
@@ -374,11 +369,11 @@ export let toArray = (set) => {
|
|
|
374
369
|
*
|
|
375
370
|
* @since 0.3.0
|
|
376
371
|
*/
|
|
377
|
-
export let fromArray =
|
|
378
|
-
let set = make()
|
|
379
|
-
Array.forEach(
|
|
380
|
-
add(key, set)
|
|
381
|
-
}, array)
|
|
372
|
+
export let fromArray = array => {
|
|
373
|
+
let set = make()
|
|
374
|
+
Array.forEach(key => {
|
|
375
|
+
add(key, set)
|
|
376
|
+
}, array)
|
|
382
377
|
set
|
|
383
378
|
}
|
|
384
379
|
|
|
@@ -392,13 +387,13 @@ export let fromArray = (array) => {
|
|
|
392
387
|
* @since 0.3.0
|
|
393
388
|
*/
|
|
394
389
|
export let union = (set1, set2) => {
|
|
395
|
-
let set = make()
|
|
396
|
-
forEach(
|
|
397
|
-
add(key, set)
|
|
390
|
+
let set = make()
|
|
391
|
+
forEach(key => {
|
|
392
|
+
add(key, set)
|
|
398
393
|
}, set1)
|
|
399
|
-
forEach(
|
|
400
|
-
add(key, set)
|
|
401
|
-
}, set2)
|
|
394
|
+
forEach(key => {
|
|
395
|
+
add(key, set)
|
|
396
|
+
}, set2)
|
|
402
397
|
set
|
|
403
398
|
}
|
|
404
399
|
|
|
@@ -412,17 +407,17 @@ export let union = (set1, set2) => {
|
|
|
412
407
|
* @since 0.3.0
|
|
413
408
|
*/
|
|
414
409
|
export let diff = (set1, set2) => {
|
|
415
|
-
let set = make()
|
|
416
|
-
forEach(
|
|
410
|
+
let set = make()
|
|
411
|
+
forEach(key => {
|
|
417
412
|
if (!contains(key, set2)) {
|
|
418
|
-
add(key, set)
|
|
413
|
+
add(key, set)
|
|
419
414
|
}
|
|
420
415
|
}, set1)
|
|
421
|
-
forEach(
|
|
416
|
+
forEach(key => {
|
|
422
417
|
if (!contains(key, set1)) {
|
|
423
|
-
add(key, set)
|
|
418
|
+
add(key, set)
|
|
424
419
|
}
|
|
425
|
-
}, set2)
|
|
420
|
+
}, set2)
|
|
426
421
|
set
|
|
427
422
|
}
|
|
428
423
|
|
|
@@ -436,17 +431,17 @@ export let diff = (set1, set2) => {
|
|
|
436
431
|
* @since 0.3.0
|
|
437
432
|
*/
|
|
438
433
|
export let intersect = (set1, set2) => {
|
|
439
|
-
let set = make()
|
|
440
|
-
forEach(
|
|
434
|
+
let set = make()
|
|
435
|
+
forEach(key => {
|
|
441
436
|
if (contains(key, set2)) {
|
|
442
|
-
add(key, set)
|
|
437
|
+
add(key, set)
|
|
443
438
|
}
|
|
444
439
|
}, set1)
|
|
445
|
-
forEach(
|
|
440
|
+
forEach(key => {
|
|
446
441
|
if (contains(key, set1)) {
|
|
447
|
-
add(key, set)
|
|
442
|
+
add(key, set)
|
|
448
443
|
}
|
|
449
|
-
}, set2)
|
|
444
|
+
}, set2)
|
|
450
445
|
set
|
|
451
446
|
}
|
|
452
447
|
|
|
@@ -460,6 +455,6 @@ export let intersect = (set1, set2) => {
|
|
|
460
455
|
*
|
|
461
456
|
* @since 0.3.0
|
|
462
457
|
*/
|
|
463
|
-
export let getInternalStats =
|
|
458
|
+
export let getInternalStats = set => {
|
|
464
459
|
(set.size, Array.length(set.buckets))
|
|
465
460
|
}
|
package/stack.gr
CHANGED
|
@@ -13,7 +13,7 @@ import List from "list"
|
|
|
13
13
|
* Stacks are immutable data structures that store their data in a List.
|
|
14
14
|
*/
|
|
15
15
|
record Stack<a> {
|
|
16
|
-
|
|
16
|
+
data: List<a>,
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -26,7 +26,7 @@ record Stack<a> {
|
|
|
26
26
|
* @returns An empty stack
|
|
27
27
|
*/
|
|
28
28
|
export let make = () => {
|
|
29
|
-
|
|
29
|
+
{ data: [], }
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/**
|
|
@@ -35,11 +35,11 @@ export let make = () => {
|
|
|
35
35
|
* @param stack: The stack to check
|
|
36
36
|
* @returns `true` if the stack has no items, and `false` otherwise
|
|
37
37
|
*/
|
|
38
|
-
export let isEmpty =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
export let isEmpty = stack => {
|
|
39
|
+
match (stack) {
|
|
40
|
+
{ data: [] } => true,
|
|
41
|
+
_ => false,
|
|
42
|
+
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|
|
@@ -48,11 +48,11 @@ export let isEmpty = (stack) => {
|
|
|
48
48
|
* @param stack: The stack to inspect
|
|
49
49
|
* @returns The value at the top of the stack, if it exists
|
|
50
50
|
*/
|
|
51
|
-
export let peek =
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
export let peek = stack => {
|
|
52
|
+
match (stack) {
|
|
53
|
+
{ data: [] } => None,
|
|
54
|
+
{ data } => List.head(data),
|
|
55
|
+
}
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/**
|
|
@@ -63,10 +63,10 @@ export let peek = (stack) => {
|
|
|
63
63
|
* @returns A new stack with the item added to the end
|
|
64
64
|
*/
|
|
65
65
|
export let push = (value, stack) => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
match (stack) {
|
|
67
|
+
{ data: [] } => { data: [value], },
|
|
68
|
+
{ data } => { data: [value, ...data], },
|
|
69
|
+
}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
/**
|
|
@@ -75,11 +75,11 @@ export let push = (value, stack) => {
|
|
|
75
75
|
* @param stack: The stack being updated
|
|
76
76
|
* @returns A new stack with the last item removed
|
|
77
77
|
*/
|
|
78
|
-
export let pop =
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
export let pop = stack => {
|
|
79
|
+
match (stack) {
|
|
80
|
+
{ data: [] } => stack,
|
|
81
|
+
{ data: [head, ...tail] } => { data: tail, },
|
|
82
|
+
}
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
/**
|
|
@@ -88,9 +88,9 @@ export let pop = (stack) => {
|
|
|
88
88
|
* @param stack: The stack to inspect
|
|
89
89
|
* @returns The count of the items in the stack
|
|
90
90
|
*/
|
|
91
|
-
export let size =
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
export let size = stack => {
|
|
92
|
+
match (stack) {
|
|
93
|
+
{ data: [] } => 0,
|
|
94
|
+
{ data } => List.length(data),
|
|
95
|
+
}
|
|
96
96
|
}
|