@grain/stdlib 0.6.6 → 0.7.1
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 +67 -0
- package/LICENSE +1 -1
- package/README.md +2 -2
- package/array.gr +55 -7
- package/array.md +606 -560
- package/bigint.md +228 -228
- package/buffer.gr +85 -53
- package/buffer.md +442 -319
- package/bytes.gr +112 -35
- package/bytes.md +299 -219
- package/char.gr +201 -99
- package/char.md +447 -120
- package/exception.gr +11 -11
- package/exception.md +29 -4
- package/float32.gr +327 -3
- package/float32.md +698 -111
- package/float64.gr +320 -3
- package/float64.md +698 -111
- package/fs.gr +1082 -0
- package/fs.md +630 -0
- package/hash.gr +142 -88
- package/hash.md +105 -17
- package/int16.md +178 -178
- package/int32.gr +26 -5
- package/int32.md +266 -231
- package/int64.gr +27 -2
- package/int64.md +266 -231
- package/int8.md +178 -178
- package/json.gr +366 -51
- package/json.md +431 -15
- package/list.gr +328 -31
- package/list.md +759 -336
- package/map.gr +20 -12
- package/map.md +266 -260
- package/marshal.gr +41 -40
- package/marshal.md +14 -14
- package/number.gr +278 -35
- package/number.md +688 -269
- package/option.md +162 -162
- package/package.json +5 -3
- package/path.gr +48 -0
- package/path.md +180 -89
- package/pervasives.gr +2 -2
- package/pervasives.md +275 -275
- package/priorityqueue.gr +7 -7
- package/priorityqueue.md +131 -131
- package/queue.gr +183 -29
- package/queue.md +404 -148
- package/random.md +43 -43
- package/range.gr +4 -4
- package/range.md +42 -42
- package/rational.md +123 -123
- package/regex.gr +52 -51
- package/regex.md +102 -102
- package/result.md +118 -118
- package/runtime/atof/common.md +39 -39
- package/runtime/atof/decimal.gr +6 -6
- package/runtime/atof/decimal.md +14 -14
- package/runtime/atof/lemire.gr +5 -5
- package/runtime/atof/lemire.md +1 -1
- package/runtime/atof/parse.gr +16 -16
- package/runtime/atof/parse.md +2 -2
- package/runtime/atof/slow.md +1 -1
- package/runtime/atof/table.md +2 -2
- package/runtime/atoi/parse.gr +3 -3
- package/runtime/atoi/parse.md +1 -1
- package/runtime/bigint.gr +15 -47
- package/runtime/bigint.md +54 -60
- package/runtime/compare.gr +2 -2
- package/runtime/compare.md +8 -8
- package/runtime/dataStructures.md +211 -211
- package/runtime/debugPrint.gr +4 -1
- package/runtime/debugPrint.md +9 -9
- package/runtime/equal.gr +99 -77
- package/runtime/equal.md +8 -8
- package/runtime/exception.gr +62 -82
- package/runtime/exception.md +62 -11
- package/runtime/gc.gr +39 -45
- package/runtime/gc.md +4 -4
- package/runtime/malloc.gr +7 -7
- package/runtime/malloc.md +13 -13
- package/runtime/math/kernel/cos.gr +70 -0
- package/runtime/math/kernel/cos.md +14 -0
- package/runtime/math/kernel/sin.gr +65 -0
- package/runtime/math/kernel/sin.md +14 -0
- package/runtime/math/kernel/tan.gr +136 -0
- package/runtime/math/kernel/tan.md +14 -0
- package/runtime/math/rempio2.gr +244 -0
- package/runtime/math/rempio2.md +14 -0
- package/runtime/math/trig.gr +130 -0
- package/runtime/math/trig.md +28 -0
- package/runtime/math/umuldi.gr +26 -0
- package/runtime/math/umuldi.md +14 -0
- package/runtime/numberUtils.gr +29 -29
- package/runtime/numberUtils.md +12 -12
- package/runtime/numbers.gr +373 -381
- package/runtime/numbers.md +348 -342
- package/runtime/string.gr +37 -105
- package/runtime/string.md +20 -26
- package/runtime/unsafe/constants.md +24 -24
- package/runtime/unsafe/conv.md +19 -19
- package/runtime/unsafe/memory.gr +24 -20
- package/runtime/unsafe/memory.md +27 -7
- package/runtime/unsafe/offsets.gr +36 -0
- package/runtime/unsafe/offsets.md +88 -0
- package/runtime/unsafe/panic.gr +28 -0
- package/runtime/unsafe/panic.md +14 -0
- package/runtime/unsafe/tags.md +32 -32
- package/runtime/unsafe/wasmf32.md +28 -28
- package/runtime/unsafe/wasmf64.md +28 -28
- package/runtime/unsafe/wasmi32.md +47 -47
- package/runtime/unsafe/wasmi64.md +50 -50
- package/runtime/utf8.gr +189 -0
- package/runtime/utf8.md +117 -0
- package/runtime/wasi.gr +4 -2
- package/runtime/wasi.md +147 -147
- package/set.gr +18 -11
- package/set.md +253 -247
- package/stack.gr +171 -2
- package/stack.md +371 -89
- package/string.gr +352 -557
- package/string.md +298 -255
- package/uint16.md +170 -170
- package/uint32.gr +25 -4
- package/uint32.md +249 -214
- package/uint64.gr +25 -5
- package/uint64.md +249 -214
- package/uint8.md +170 -170
- package/uri.gr +57 -53
- package/uri.md +88 -89
- package/wasi/file.gr +67 -59
- package/wasi/file.md +308 -308
- package/wasi/process.md +26 -26
- package/wasi/random.md +12 -12
- package/wasi/time.md +16 -16
- package/runtime/utils/printing.gr +0 -60
- package/runtime/utils/printing.md +0 -26
package/map.gr
CHANGED
|
@@ -14,7 +14,6 @@ from "option" include Option
|
|
|
14
14
|
from "runtime/dataStructures" include DataStructures
|
|
15
15
|
use DataStructures.{ allocateArray, untagSimpleNumber }
|
|
16
16
|
from "hash" include Hash
|
|
17
|
-
use Hash.{ hash }
|
|
18
17
|
from "runtime/unsafe/memory" include Memory
|
|
19
18
|
from "runtime/unsafe/wasmi32" include WasmI32
|
|
20
19
|
|
|
@@ -27,6 +26,7 @@ record rec Bucket<k, v> {
|
|
|
27
26
|
|
|
28
27
|
abstract record Map<k, v> {
|
|
29
28
|
mut size: Number,
|
|
29
|
+
hashInstance: Hash.HashInstance,
|
|
30
30
|
mut buckets: Array<Option<Bucket<k, v>>>,
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -47,25 +47,28 @@ provide record InternalMapStats {
|
|
|
47
47
|
* @param size: The initial storage size of the map
|
|
48
48
|
* @returns An empty map with the given initial storage size
|
|
49
49
|
*
|
|
50
|
+
* @throws Failure(String): If WASI random_get fails
|
|
51
|
+
*
|
|
50
52
|
* @since v0.2.0
|
|
51
53
|
* @history v0.6.0: Merged with `makeSized`; modified signature to accept size
|
|
52
54
|
*/
|
|
53
55
|
provide let make = (size=16) => { // TODO: This could take an `eq` function to custom comparisons
|
|
54
56
|
let buckets = Array.make(size, None)
|
|
55
|
-
|
|
57
|
+
let hashInstance = Hash.make()
|
|
58
|
+
{ size: 0, hashInstance, buckets }
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
let getBucketIndex = (key, buckets) => {
|
|
61
|
+
let getBucketIndex = (hashInstance, key, buckets) => {
|
|
59
62
|
let bucketsLength = Array.length(buckets)
|
|
60
|
-
let hashedKey = hash(key)
|
|
63
|
+
let hashedKey = Hash.hash(hashInstance, key)
|
|
61
64
|
hashedKey % bucketsLength
|
|
62
65
|
}
|
|
63
66
|
|
|
64
|
-
let rec copyNodeWithNewHash = (oldNode, next, tail) => {
|
|
67
|
+
let rec copyNodeWithNewHash = (hashInstance, oldNode, next, tail) => {
|
|
65
68
|
match (oldNode) {
|
|
66
69
|
None => void,
|
|
67
70
|
Some(node) => {
|
|
68
|
-
let idx = getBucketIndex(node.key, next)
|
|
71
|
+
let idx = getBucketIndex(hashInstance, node.key, next)
|
|
69
72
|
let newNode = Some(node)
|
|
70
73
|
match (tail[idx]) {
|
|
71
74
|
None => {
|
|
@@ -79,7 +82,7 @@ let rec copyNodeWithNewHash = (oldNode, next, tail) => {
|
|
|
79
82
|
// Always place this node as the new tail
|
|
80
83
|
tail[idx] = newNode
|
|
81
84
|
// Recurse with the next node
|
|
82
|
-
copyNodeWithNewHash(node.next, next, tail)
|
|
85
|
+
copyNodeWithNewHash(hashInstance, node.next, next, tail)
|
|
83
86
|
},
|
|
84
87
|
}
|
|
85
88
|
}
|
|
@@ -93,8 +96,9 @@ let resize = map => {
|
|
|
93
96
|
// This tracks the tail nodes so we can set their `next` to None
|
|
94
97
|
let tailNodes = Array.make(nextSize, None)
|
|
95
98
|
map.buckets = nextBuckets
|
|
99
|
+
let hashInstance = map.hashInstance
|
|
96
100
|
Array.forEach(old => {
|
|
97
|
-
copyNodeWithNewHash(old, nextBuckets, tailNodes)
|
|
101
|
+
copyNodeWithNewHash(hashInstance, old, nextBuckets, tailNodes)
|
|
98
102
|
}, currentBuckets)
|
|
99
103
|
Array.forEach(tail => {
|
|
100
104
|
match (tail) {
|
|
@@ -132,7 +136,8 @@ let rec replaceInBucket = (key, value, node) => {
|
|
|
132
136
|
*/
|
|
133
137
|
provide let set = (key, value, map) => {
|
|
134
138
|
let buckets = map.buckets
|
|
135
|
-
let
|
|
139
|
+
let hashInstance = map.hashInstance
|
|
140
|
+
let idx = getBucketIndex(hashInstance, key, buckets)
|
|
136
141
|
let bucket = buckets[idx]
|
|
137
142
|
match (bucket) {
|
|
138
143
|
None => {
|
|
@@ -176,7 +181,8 @@ let rec valueFromBucket = (key, node) => {
|
|
|
176
181
|
*/
|
|
177
182
|
provide let get = (key, map) => {
|
|
178
183
|
let buckets = map.buckets
|
|
179
|
-
let
|
|
184
|
+
let hashInstance = map.hashInstance
|
|
185
|
+
let idx = getBucketIndex(hashInstance, key, buckets)
|
|
180
186
|
let bucket = buckets[idx]
|
|
181
187
|
match (bucket) {
|
|
182
188
|
None => None,
|
|
@@ -206,7 +212,8 @@ let rec nodeInBucket = (key, node) => {
|
|
|
206
212
|
*/
|
|
207
213
|
provide let contains = (key, map) => {
|
|
208
214
|
let buckets = map.buckets
|
|
209
|
-
let
|
|
215
|
+
let hashInstance = map.hashInstance
|
|
216
|
+
let idx = getBucketIndex(hashInstance, key, buckets)
|
|
210
217
|
let bucket = buckets[idx]
|
|
211
218
|
match (bucket) {
|
|
212
219
|
None => false,
|
|
@@ -238,7 +245,8 @@ let rec removeInBucket = (key, node) => {
|
|
|
238
245
|
*/
|
|
239
246
|
provide let remove = (key, map) => {
|
|
240
247
|
let buckets = map.buckets
|
|
241
|
-
let
|
|
248
|
+
let hashInstance = map.hashInstance
|
|
249
|
+
let idx = getBucketIndex(hashInstance, key, buckets)
|
|
242
250
|
let bucket = buckets[idx]
|
|
243
251
|
match (bucket) {
|
|
244
252
|
None => void,
|