@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/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 = (storageLength) => {
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 = (set) => {
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((old) => {
87
- copyNodeWithNewHash(old, nextBuckets, tailNodes);
88
- }, currentBuckets);
89
- Array.forEach((tail) => {
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 > (Array.length(buckets) * 2)) {
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 = (set) => {
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 = (set) => {
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 = (set) => {
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((bucket) => {
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((bucket) => {
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
- if (!predicate(key)) {
308
- [key, ...list]
309
- } else {
310
- list
311
- }, [], set);
312
- List.forEach((key) => {
313
- remove(key, set);
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((key) => !predicate(key), set)
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 = (set) => {
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 = (list) => {
350
- let set = make();
351
- List.forEach((key) => {
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 = (set) => {
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 = (array) => {
378
- let set = make();
379
- Array.forEach((key) => {
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((key) => {
397
- add(key, set);
390
+ let set = make()
391
+ forEach(key => {
392
+ add(key, set)
398
393
  }, set1)
399
- forEach((key) => {
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((key) => {
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((key) => {
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((key) => {
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((key) => {
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 = (set) => {
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
- data: List<a>
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
- { data: [] }
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 = (stack) => {
39
- match (stack) {
40
- { data: [] } => true,
41
- _ => false
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 = (stack) => {
52
- match (stack) {
53
- { data: [] } => None,
54
- { data } => List.head(data)
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
- match (stack) {
67
- { data: [] } => { data: [value] },
68
- { data } => { data: [value, ...data] }
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 = (stack) => {
79
- match (stack) {
80
- { data: [] } => stack,
81
- { data: [head, ...tail] } => { data: tail, }
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 = (stack) => {
92
- match (stack) {
93
- { data: [] } => 0,
94
- { data } => List.length(data)
95
- }
91
+ export let size = stack => {
92
+ match (stack) {
93
+ { data: [] } => 0,
94
+ { data } => List.length(data),
95
+ }
96
96
  }