@grain/stdlib 0.5.13 → 0.6.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 (155) hide show
  1. package/CHANGELOG.md +201 -0
  2. package/LICENSE +1 -1
  3. package/README.md +25 -2
  4. package/array.gr +1512 -199
  5. package/array.md +2032 -94
  6. package/bigint.gr +239 -140
  7. package/bigint.md +450 -106
  8. package/buffer.gr +595 -102
  9. package/buffer.md +903 -145
  10. package/bytes.gr +401 -110
  11. package/bytes.md +551 -63
  12. package/char.gr +228 -49
  13. package/char.md +373 -7
  14. package/exception.gr +26 -12
  15. package/exception.md +29 -5
  16. package/float32.gr +130 -109
  17. package/float32.md +185 -57
  18. package/float64.gr +112 -99
  19. package/float64.md +185 -57
  20. package/hash.gr +62 -40
  21. package/hash.md +27 -3
  22. package/int16.gr +430 -0
  23. package/int16.md +618 -0
  24. package/int32.gr +200 -269
  25. package/int32.md +254 -289
  26. package/int64.gr +142 -225
  27. package/int64.md +254 -289
  28. package/int8.gr +511 -0
  29. package/int8.md +786 -0
  30. package/json.gr +2071 -0
  31. package/json.md +646 -0
  32. package/list.gr +120 -68
  33. package/list.md +125 -80
  34. package/map.gr +560 -57
  35. package/map.md +672 -56
  36. package/marshal.gr +239 -227
  37. package/marshal.md +36 -4
  38. package/number.gr +626 -676
  39. package/number.md +738 -153
  40. package/option.gr +33 -35
  41. package/option.md +58 -42
  42. package/package.json +2 -2
  43. package/path.gr +148 -187
  44. package/path.md +47 -96
  45. package/pervasives.gr +75 -416
  46. package/pervasives.md +85 -180
  47. package/priorityqueue.gr +433 -74
  48. package/priorityqueue.md +422 -54
  49. package/queue.gr +362 -80
  50. package/queue.md +433 -38
  51. package/random.gr +67 -75
  52. package/random.md +68 -40
  53. package/range.gr +135 -63
  54. package/range.md +198 -43
  55. package/rational.gr +284 -0
  56. package/rational.md +545 -0
  57. package/regex.gr +933 -1066
  58. package/regex.md +59 -60
  59. package/result.gr +23 -25
  60. package/result.md +54 -39
  61. package/runtime/atof/common.gr +78 -82
  62. package/runtime/atof/common.md +22 -10
  63. package/runtime/atof/decimal.gr +102 -127
  64. package/runtime/atof/decimal.md +28 -7
  65. package/runtime/atof/lemire.gr +56 -71
  66. package/runtime/atof/lemire.md +9 -1
  67. package/runtime/atof/parse.gr +83 -110
  68. package/runtime/atof/parse.md +12 -2
  69. package/runtime/atof/slow.gr +28 -35
  70. package/runtime/atof/slow.md +9 -1
  71. package/runtime/atof/table.gr +19 -18
  72. package/runtime/atof/table.md +10 -2
  73. package/runtime/atoi/parse.gr +153 -136
  74. package/runtime/atoi/parse.md +50 -1
  75. package/runtime/bigint.gr +410 -517
  76. package/runtime/bigint.md +71 -57
  77. package/runtime/compare.gr +176 -85
  78. package/runtime/compare.md +31 -1
  79. package/runtime/dataStructures.gr +144 -32
  80. package/runtime/dataStructures.md +267 -31
  81. package/runtime/debugPrint.gr +34 -15
  82. package/runtime/debugPrint.md +37 -5
  83. package/runtime/equal.gr +53 -52
  84. package/runtime/equal.md +30 -1
  85. package/runtime/exception.gr +38 -47
  86. package/runtime/exception.md +10 -8
  87. package/runtime/gc.gr +23 -152
  88. package/runtime/gc.md +13 -17
  89. package/runtime/malloc.gr +31 -31
  90. package/runtime/malloc.md +11 -3
  91. package/runtime/numberUtils.gr +193 -174
  92. package/runtime/numberUtils.md +29 -9
  93. package/runtime/numbers.gr +1695 -1021
  94. package/runtime/numbers.md +1098 -134
  95. package/runtime/string.gr +543 -245
  96. package/runtime/string.md +76 -6
  97. package/runtime/unsafe/constants.gr +30 -13
  98. package/runtime/unsafe/constants.md +80 -0
  99. package/runtime/unsafe/conv.gr +55 -28
  100. package/runtime/unsafe/conv.md +41 -9
  101. package/runtime/unsafe/memory.gr +10 -30
  102. package/runtime/unsafe/memory.md +15 -19
  103. package/runtime/unsafe/tags.gr +37 -21
  104. package/runtime/unsafe/tags.md +88 -8
  105. package/runtime/unsafe/wasmf32.gr +30 -36
  106. package/runtime/unsafe/wasmf32.md +64 -56
  107. package/runtime/unsafe/wasmf64.gr +30 -36
  108. package/runtime/unsafe/wasmf64.md +64 -56
  109. package/runtime/unsafe/wasmi32.gr +49 -66
  110. package/runtime/unsafe/wasmi32.md +102 -94
  111. package/runtime/unsafe/wasmi64.gr +52 -79
  112. package/runtime/unsafe/wasmi64.md +108 -100
  113. package/runtime/utils/printing.gr +13 -15
  114. package/runtime/utils/printing.md +11 -3
  115. package/runtime/wasi.gr +294 -295
  116. package/runtime/wasi.md +62 -42
  117. package/set.gr +574 -64
  118. package/set.md +634 -54
  119. package/stack.gr +181 -64
  120. package/stack.md +271 -42
  121. package/string.gr +453 -533
  122. package/string.md +241 -151
  123. package/uint16.gr +369 -0
  124. package/uint16.md +585 -0
  125. package/uint32.gr +470 -0
  126. package/uint32.md +737 -0
  127. package/uint64.gr +471 -0
  128. package/uint64.md +737 -0
  129. package/uint8.gr +369 -0
  130. package/uint8.md +585 -0
  131. package/uri.gr +1093 -0
  132. package/uri.md +477 -0
  133. package/{sys → wasi}/file.gr +914 -500
  134. package/{sys → wasi}/file.md +454 -50
  135. package/wasi/process.gr +292 -0
  136. package/{sys → wasi}/process.md +164 -6
  137. package/wasi/random.gr +77 -0
  138. package/wasi/random.md +80 -0
  139. package/{sys → wasi}/time.gr +15 -22
  140. package/{sys → wasi}/time.md +5 -5
  141. package/immutablearray.gr +0 -929
  142. package/immutablearray.md +0 -1038
  143. package/immutablemap.gr +0 -493
  144. package/immutablemap.md +0 -479
  145. package/immutablepriorityqueue.gr +0 -360
  146. package/immutablepriorityqueue.md +0 -291
  147. package/immutableset.gr +0 -498
  148. package/immutableset.md +0 -449
  149. package/runtime/debug.gr +0 -2
  150. package/runtime/debug.md +0 -6
  151. package/runtime/unsafe/errors.gr +0 -36
  152. package/runtime/unsafe/errors.md +0 -204
  153. package/sys/process.gr +0 -254
  154. package/sys/random.gr +0 -79
  155. package/sys/random.md +0 -66
@@ -1,5 +1,3 @@
1
- /* grainc-flags --no-pervasives */
2
-
3
1
  // This module was based on Rust's dec2flt
4
2
  // https://github.com/rust-lang/rust/blob/1cbc45942d5c0f6eb5d94e3b10762ba541958035/library/core/src/num/dec2flt/common.rs
5
3
  // Rust's MIT license is provided below:
@@ -13,11 +11,11 @@
13
11
  * the Software, and to permit persons to whom the Software
14
12
  * is furnished to do so, subject to the following
15
13
  * conditions:
16
- *
14
+ *
17
15
  * The above copyright notice and this permission notice
18
16
  * shall be included in all copies or substantial portions
19
17
  * of the Software.
20
- *
18
+ *
21
19
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
22
20
  * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
23
21
  * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
@@ -28,111 +26,114 @@
28
26
  * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29
27
  * DEALINGS IN THE SOFTWARE.
30
28
  */
31
-
32
- import WasmI32 from "runtime/unsafe/wasmi32"
33
- import WasmI64 from "runtime/unsafe/wasmi64"
34
- import WasmF64 from "runtime/unsafe/wasmf64"
35
- import { newInt32, newInt64, newFloat64 } from "runtime/dataStructures"
36
- import { get_POWERS10 } from "runtime/numberUtils"
37
- import { get_F64_POWERS10_FAST_PATH, get_POWERS5 } from "./table"
38
-
39
- primitive (&&): (Bool, Bool) -> Bool = "@and"
40
- primitive (||): (Bool, Bool) -> Bool = "@or"
41
- primitive (!): Bool -> Bool = "@not"
42
-
43
- export record BiasedFp {
29
+ @noPervasives
30
+ module Common
31
+
32
+ from "runtime/unsafe/wasmi32" include WasmI32
33
+ from "runtime/unsafe/wasmi64" include WasmI64
34
+ from "runtime/unsafe/wasmf64" include WasmF64
35
+ from "runtime/dataStructures" include DataStructures
36
+ use DataStructures.{ newInt32, newInt64, newFloat64 }
37
+ from "runtime/numberUtils" include NumberUtils
38
+ use NumberUtils.{ get_POWERS10 }
39
+ from "runtime/atof/table" include Table
40
+ use Table.{ get_F64_POWERS10_FAST_PATH, get_POWERS5 }
41
+
42
+ primitive (&&) = "@and"
43
+ primitive (||) = "@or"
44
+ primitive (!) = "@not"
45
+
46
+ provide record BiasedFp {
44
47
  f: Int64,
45
48
  mut e: Int32,
46
49
  }
47
50
 
48
51
  @unsafe
49
- export let _MINIMUM_EXPONENT = -1023n
52
+ provide let _MINIMUM_EXPONENT = -1023n
50
53
  @unsafe
51
- export let _MIN_EXPONENT_ROUND_TO_EVEN = -4N
54
+ provide let _MIN_EXPONENT_ROUND_TO_EVEN = -4N
52
55
  @unsafe
53
- export let _MAX_EXPONENT_ROUND_TO_EVEN = 23N
56
+ provide let _MAX_EXPONENT_ROUND_TO_EVEN = 23N
54
57
  @unsafe
55
- export let _MIN_EXPONENT_FAST_PATH = -22n
58
+ provide let _MIN_EXPONENT_FAST_PATH = -22n
56
59
  @unsafe
57
- export let _MAX_EXPONENT_FAST_PATH = 22n
60
+ provide let _MAX_EXPONENT_FAST_PATH = 22n
58
61
  @unsafe
59
- export let _MAX_EXPONENT_DISGUISED_FAST_PATH = 37n
62
+ provide let _MAX_EXPONENT_DISGUISED_FAST_PATH = 37n
60
63
  @unsafe
61
- export let _MAX_MANTISSA_FAST_PATH = WasmI64.shl(2N, 52N)
64
+ provide let _MAX_MANTISSA_FAST_PATH = {
65
+ use WasmI64.{ (<<) }
66
+ 2N << 52N
67
+ }
62
68
  @unsafe
63
- export let _MANTISSA_EXPLICIT_BITS_64 = 52N
69
+ provide let _MANTISSA_EXPLICIT_BITS_64 = 52N
64
70
  @unsafe
65
- export let _MANTISSA_EXPLICIT_BITS_32 = 52n
71
+ provide let _MANTISSA_EXPLICIT_BITS_32 = 52n
66
72
  @unsafe
67
- export let _INFINITE_POWER = 0x7FFn
73
+ provide let _INFINITE_POWER = 0x7FFn
68
74
  @unsafe
69
- export let _SMALLEST_POWER_OF_TEN = -342N
75
+ provide let _SMALLEST_POWER_OF_TEN = -342N
70
76
  @unsafe
71
- export let _LARGEST_POWER_OF_TEN = 308N
77
+ provide let _LARGEST_POWER_OF_TEN = 308N
72
78
  @unsafe
73
- export let _SMALLEST_POWER_OF_FIVE = -342N
79
+ provide let _SMALLEST_POWER_OF_FIVE = -342N
74
80
  @unsafe
75
- export let _LARGEST_POWER_OF_FIVE = 308N
81
+ provide let _LARGEST_POWER_OF_FIVE = 308N
76
82
 
77
83
  @unsafe
78
- export let _CHAR_CODE_UNDERSCORE = 0x5fn
84
+ provide let _CHAR_CODE_UNDERSCORE = 0x5fn
79
85
  @unsafe
80
- export let _CHAR_CODE_PLUS = 0x2Bn
86
+ provide let _CHAR_CODE_PLUS = 0x2Bn
81
87
  @unsafe
82
- export let _CHAR_CODE_MINUS = 0x2Dn
88
+ provide let _CHAR_CODE_MINUS = 0x2Dn
83
89
  @unsafe
84
- export let _CHAR_CODE_0 = 0x30n
90
+ provide let _CHAR_CODE_0 = 0x30n
85
91
  @unsafe
86
- export let _CHAR_CODE_e = 0x65n
92
+ provide let _CHAR_CODE_e = 0x65n
87
93
  @unsafe
88
- export let _CHAR_CODE_E = 0x45n
94
+ provide let _CHAR_CODE_E = 0x45n
89
95
  @unsafe
90
- export let _CHAR_CODE_DOT = 0x2En
96
+ provide let _CHAR_CODE_DOT = 0x2En
91
97
  @unsafe
92
- export let _CHAR_CODE_A = 0x41n
98
+ provide let _CHAR_CODE_A = 0x41n
93
99
  @unsafe
94
- export let _CHAR_CODE_Z = 0x5an
100
+ provide let _CHAR_CODE_Z = 0x5an
95
101
  @unsafe
96
- export let _CHAR_CODE_a = 0x61n
102
+ provide let _CHAR_CODE_a = 0x61n
97
103
  @unsafe
98
- export let _CHAR_CODE_f = 0x66n
104
+ provide let _CHAR_CODE_f = 0x66n
99
105
  @unsafe
100
- export let _CHAR_CODE_i = 0x69n
106
+ provide let _CHAR_CODE_i = 0x69n
101
107
  @unsafe
102
- export let _CHAR_CODE_n = 0x6en
108
+ provide let _CHAR_CODE_n = 0x6en
103
109
  @unsafe
104
- export let _CHAR_CODE_t = 0x74n
110
+ provide let _CHAR_CODE_t = 0x74n
105
111
  @unsafe
106
- export let _CHAR_CODE_y = 0x79n
112
+ provide let _CHAR_CODE_y = 0x79n
107
113
 
108
- export let fpZero = () => { f: 0L, e: 0l }
114
+ provide let fpZero = () => { f: 0L, e: 0l }
109
115
  @unsafe
110
- export let fpInf = () =>
111
- {
112
- f: 0L,
113
- e: WasmI32.toGrain(newInt32(_INFINITE_POWER)): Int32,
114
- }
115
- export let fpErr = () => { f: 0L, e: -1l }
116
- export let fpNan = () => { f: 1L, e: -1l }
116
+ provide let fpInf = () =>
117
+ { f: 0L, e: WasmI32.toGrain(newInt32(_INFINITE_POWER)): Int32 }
118
+ provide let fpErr = () => { f: 0L, e: -1l }
119
+ provide let fpNan = () => { f: 1L, e: -1l }
117
120
 
118
121
  @unsafe
119
- export let getPowers10 = (i: WasmI32) => {
120
- WasmI32.load(get_POWERS10(), WasmI32.mul(4n, i))
122
+ provide let getPowers10 = (i: WasmI32) => {
123
+ use WasmI32.{ (*) }
124
+ WasmI32.load(get_POWERS10(), 4n * i)
121
125
  }
122
126
 
123
127
  @unsafe
124
- export let getPowers10FastPath = (i: WasmI32) => {
125
- WasmF64.load(get_F64_POWERS10_FAST_PATH(), WasmI32.mul(8n, i))
128
+ provide let getPowers10FastPath = (i: WasmI32) => {
129
+ use WasmI32.{ (*) }
130
+ WasmF64.load(get_F64_POWERS10_FAST_PATH(), 8n * i)
126
131
  }
127
132
 
128
133
  // https://stdrs.dev/nightly/x86_64-unknown-linux-gnu/src/core/num/dec2flt/common.rs.html#165
129
134
  @unsafe
130
- export let is8Digits = (value: WasmI64) => {
131
- let (+) = WasmI64.add
132
- let (-) = WasmI64.sub
133
- let (|) = WasmI64.or
134
- let (&) = WasmI64.and
135
- let (==) = WasmI64.eq
135
+ provide let is8Digits = (value: WasmI64) => {
136
+ use WasmI64.{ (+), (-), (|), (&), (==) }
136
137
 
137
138
  let a = value + 0x4646_4646_4646_4646N
138
139
  let b = value - 0x3030_3030_3030_3030N
@@ -147,37 +148,31 @@ export let is8Digits = (value: WasmI64) => {
147
148
  // log2(10), where 217706 / 2^16 is accurate for the
148
149
  // entire range of non-finite decimal exponents.
149
150
  @unsafe
150
- export let power = (q: WasmI32) => {
151
- let (+) = WasmI32.add
152
- let (*) = WasmI32.mul
153
- let (>>) = WasmI32.shrS
151
+ provide let power = (q: WasmI32) => {
152
+ use WasmI32.{ (+), (*), (>>) }
154
153
 
155
154
  ((q * (152_170n + 65536n)) >> 16n) + 63n
156
155
  }
157
156
 
158
157
  @unsafe
159
- export let fullMultiplication = (a: WasmI64, b: WasmI64) => {
158
+ provide let fullMultiplication = (a: WasmI64, b: WasmI64) => {
160
159
  // Adapted from https://www.codeproject.com/Tips/618570/UInt-Multiplication-Squaring
161
- let (+) = WasmI64.add
162
- let (*) = WasmI64.mul
163
- let (&) = WasmI64.and
164
- let (>>) = WasmI64.shrU
165
- let (<<) = WasmI64.shl
160
+ use WasmI64.{ (+), (*), (&), (>>>), (<<) }
166
161
 
167
162
  let aLo = a & 0xffffffffN
168
163
  let bLo = b & 0xffffffffN
169
164
  let aLoxbLo = aLo * bLo
170
165
  let w3 = aLoxbLo & 0xffffffffN
171
- let k = aLoxbLo >> 32N
166
+ let k = aLoxbLo >>> 32N
172
167
 
173
- let aHi = a >> 32N
168
+ let aHi = a >>> 32N
174
169
  let mid = aHi * bLo + k
175
170
  let k = mid & 0xffffffffN
176
- let w1 = mid >> 32N
171
+ let w1 = mid >>> 32N
177
172
 
178
- let bHi = b >> 32N
173
+ let bHi = b >>> 32N
179
174
  let mid = aLo * bHi + k
180
- let k = mid >> 32N
175
+ let k = mid >>> 32N
181
176
 
182
177
  let hi = aHi * bHi + w1 + k
183
178
  let lo = (mid << 32N) + w3
@@ -186,10 +181,11 @@ export let fullMultiplication = (a: WasmI64, b: WasmI64) => {
186
181
  }
187
182
 
188
183
  @unsafe
189
- export let biasedFpToNumber = (fp, negative) => {
184
+ provide let biasedFpToNumber = (fp, negative) => {
185
+ use WasmI64.{ (|), (<<) }
190
186
  let f = WasmI64.load(WasmI32.fromGrain(fp.f), 8n)
191
- let e = WasmI64.extendI32S(WasmI32.load(WasmI32.fromGrain(fp.e), 8n))
192
- let word = WasmI64.or(f, WasmI64.shl(e, _MANTISSA_EXPLICIT_BITS_64))
187
+ let e = WasmI64.extendI32S(WasmI32.load(WasmI32.fromGrain(fp.e), 4n))
188
+ let word = f | e << _MANTISSA_EXPLICIT_BITS_64
193
189
  let mut float = WasmF64.reinterpretI64(word)
194
190
  if (negative) {
195
191
  float = WasmF64.neg(float)
@@ -1,3 +1,11 @@
1
+ ---
2
+ title: Common
3
+ ---
4
+
5
+ ## Types
6
+
7
+ Type declarations included in the Common module.
8
+
1
9
  ### Common.**BiasedFp**
2
10
 
3
11
  ```grain
@@ -7,6 +15,10 @@ record BiasedFp {
7
15
  }
8
16
  ```
9
17
 
18
+ ## Values
19
+
20
+ Functions and constants included in the Common module.
21
+
10
22
  ### Common.**_MINIMUM_EXPONENT**
11
23
 
12
24
  ```grain
@@ -184,60 +196,60 @@ _CHAR_CODE_y : WasmI32
184
196
  ### Common.**fpZero**
185
197
 
186
198
  ```grain
187
- fpZero : () -> BiasedFp
199
+ fpZero : () => BiasedFp
188
200
  ```
189
201
 
190
202
  ### Common.**fpInf**
191
203
 
192
204
  ```grain
193
- fpInf : () -> BiasedFp
205
+ fpInf : () => BiasedFp
194
206
  ```
195
207
 
196
208
  ### Common.**fpErr**
197
209
 
198
210
  ```grain
199
- fpErr : () -> BiasedFp
211
+ fpErr : () => BiasedFp
200
212
  ```
201
213
 
202
214
  ### Common.**fpNan**
203
215
 
204
216
  ```grain
205
- fpNan : () -> BiasedFp
217
+ fpNan : () => BiasedFp
206
218
  ```
207
219
 
208
220
  ### Common.**getPowers10**
209
221
 
210
222
  ```grain
211
- getPowers10 : WasmI32 -> WasmI32
223
+ getPowers10 : (i: WasmI32) => WasmI32
212
224
  ```
213
225
 
214
226
  ### Common.**getPowers10FastPath**
215
227
 
216
228
  ```grain
217
- getPowers10FastPath : WasmI32 -> WasmF64
229
+ getPowers10FastPath : (i: WasmI32) => WasmF64
218
230
  ```
219
231
 
220
232
  ### Common.**is8Digits**
221
233
 
222
234
  ```grain
223
- is8Digits : WasmI64 -> Bool
235
+ is8Digits : (value: WasmI64) => Bool
224
236
  ```
225
237
 
226
238
  ### Common.**power**
227
239
 
228
240
  ```grain
229
- power : WasmI32 -> WasmI32
241
+ power : (q: WasmI32) => WasmI32
230
242
  ```
231
243
 
232
244
  ### Common.**fullMultiplication**
233
245
 
234
246
  ```grain
235
- fullMultiplication : (WasmI64, WasmI64) -> (Int64, Int64)
247
+ fullMultiplication : (a: WasmI64, b: WasmI64) => (Int64, Int64)
236
248
  ```
237
249
 
238
250
  ### Common.**biasedFpToNumber**
239
251
 
240
252
  ```grain
241
- biasedFpToNumber : (BiasedFp, Bool) -> Number
253
+ biasedFpToNumber : (fp: BiasedFp, negative: Bool) => Number
242
254
  ```
243
255