@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.
Files changed (137) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +1 -1
  3. package/README.md +2 -2
  4. package/array.gr +55 -7
  5. package/array.md +606 -560
  6. package/bigint.md +228 -228
  7. package/buffer.gr +85 -53
  8. package/buffer.md +442 -319
  9. package/bytes.gr +112 -35
  10. package/bytes.md +299 -219
  11. package/char.gr +201 -99
  12. package/char.md +447 -120
  13. package/exception.gr +11 -11
  14. package/exception.md +29 -4
  15. package/float32.gr +327 -3
  16. package/float32.md +698 -111
  17. package/float64.gr +320 -3
  18. package/float64.md +698 -111
  19. package/fs.gr +1082 -0
  20. package/fs.md +630 -0
  21. package/hash.gr +142 -88
  22. package/hash.md +105 -17
  23. package/int16.md +178 -178
  24. package/int32.gr +26 -5
  25. package/int32.md +266 -231
  26. package/int64.gr +27 -2
  27. package/int64.md +266 -231
  28. package/int8.md +178 -178
  29. package/json.gr +366 -51
  30. package/json.md +431 -15
  31. package/list.gr +328 -31
  32. package/list.md +759 -336
  33. package/map.gr +20 -12
  34. package/map.md +266 -260
  35. package/marshal.gr +41 -40
  36. package/marshal.md +14 -14
  37. package/number.gr +278 -35
  38. package/number.md +688 -269
  39. package/option.md +162 -162
  40. package/package.json +5 -3
  41. package/path.gr +48 -0
  42. package/path.md +180 -89
  43. package/pervasives.gr +2 -2
  44. package/pervasives.md +275 -275
  45. package/priorityqueue.gr +7 -7
  46. package/priorityqueue.md +131 -131
  47. package/queue.gr +183 -29
  48. package/queue.md +404 -148
  49. package/random.md +43 -43
  50. package/range.gr +4 -4
  51. package/range.md +42 -42
  52. package/rational.md +123 -123
  53. package/regex.gr +52 -51
  54. package/regex.md +102 -102
  55. package/result.md +118 -118
  56. package/runtime/atof/common.md +39 -39
  57. package/runtime/atof/decimal.gr +6 -6
  58. package/runtime/atof/decimal.md +14 -14
  59. package/runtime/atof/lemire.gr +5 -5
  60. package/runtime/atof/lemire.md +1 -1
  61. package/runtime/atof/parse.gr +16 -16
  62. package/runtime/atof/parse.md +2 -2
  63. package/runtime/atof/slow.md +1 -1
  64. package/runtime/atof/table.md +2 -2
  65. package/runtime/atoi/parse.gr +3 -3
  66. package/runtime/atoi/parse.md +1 -1
  67. package/runtime/bigint.gr +15 -47
  68. package/runtime/bigint.md +54 -60
  69. package/runtime/compare.gr +2 -2
  70. package/runtime/compare.md +8 -8
  71. package/runtime/dataStructures.md +211 -211
  72. package/runtime/debugPrint.gr +4 -1
  73. package/runtime/debugPrint.md +9 -9
  74. package/runtime/equal.gr +99 -77
  75. package/runtime/equal.md +8 -8
  76. package/runtime/exception.gr +62 -82
  77. package/runtime/exception.md +62 -11
  78. package/runtime/gc.gr +39 -45
  79. package/runtime/gc.md +4 -4
  80. package/runtime/malloc.gr +7 -7
  81. package/runtime/malloc.md +13 -13
  82. package/runtime/math/kernel/cos.gr +70 -0
  83. package/runtime/math/kernel/cos.md +14 -0
  84. package/runtime/math/kernel/sin.gr +65 -0
  85. package/runtime/math/kernel/sin.md +14 -0
  86. package/runtime/math/kernel/tan.gr +136 -0
  87. package/runtime/math/kernel/tan.md +14 -0
  88. package/runtime/math/rempio2.gr +244 -0
  89. package/runtime/math/rempio2.md +14 -0
  90. package/runtime/math/trig.gr +130 -0
  91. package/runtime/math/trig.md +28 -0
  92. package/runtime/math/umuldi.gr +26 -0
  93. package/runtime/math/umuldi.md +14 -0
  94. package/runtime/numberUtils.gr +29 -29
  95. package/runtime/numberUtils.md +12 -12
  96. package/runtime/numbers.gr +373 -381
  97. package/runtime/numbers.md +348 -342
  98. package/runtime/string.gr +37 -105
  99. package/runtime/string.md +20 -26
  100. package/runtime/unsafe/constants.md +24 -24
  101. package/runtime/unsafe/conv.md +19 -19
  102. package/runtime/unsafe/memory.gr +24 -20
  103. package/runtime/unsafe/memory.md +27 -7
  104. package/runtime/unsafe/offsets.gr +36 -0
  105. package/runtime/unsafe/offsets.md +88 -0
  106. package/runtime/unsafe/panic.gr +28 -0
  107. package/runtime/unsafe/panic.md +14 -0
  108. package/runtime/unsafe/tags.md +32 -32
  109. package/runtime/unsafe/wasmf32.md +28 -28
  110. package/runtime/unsafe/wasmf64.md +28 -28
  111. package/runtime/unsafe/wasmi32.md +47 -47
  112. package/runtime/unsafe/wasmi64.md +50 -50
  113. package/runtime/utf8.gr +189 -0
  114. package/runtime/utf8.md +117 -0
  115. package/runtime/wasi.gr +4 -2
  116. package/runtime/wasi.md +147 -147
  117. package/set.gr +18 -11
  118. package/set.md +253 -247
  119. package/stack.gr +171 -2
  120. package/stack.md +371 -89
  121. package/string.gr +352 -557
  122. package/string.md +298 -255
  123. package/uint16.md +170 -170
  124. package/uint32.gr +25 -4
  125. package/uint32.md +249 -214
  126. package/uint64.gr +25 -5
  127. package/uint64.md +249 -214
  128. package/uint8.md +170 -170
  129. package/uri.gr +57 -53
  130. package/uri.md +88 -89
  131. package/wasi/file.gr +67 -59
  132. package/wasi/file.md +308 -308
  133. package/wasi/process.md +26 -26
  134. package/wasi/random.md +12 -12
  135. package/wasi/time.md +16 -16
  136. package/runtime/utils/printing.gr +0 -60
  137. 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
- { size: 0, buckets }
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 idx = getBucketIndex(key, buckets)
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 idx = getBucketIndex(key, buckets)
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 idx = getBucketIndex(key, buckets)
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 idx = getBucketIndex(key, buckets)
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,