@grain/stdlib 0.5.13 → 0.6.0

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 +193 -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 +47 -37
  21. package/hash.md +21 -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 +2084 -0
  31. package/json.md +608 -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 +191 -172
  92. package/runtime/numberUtils.md +17 -9
  93. package/runtime/numbers.gr +1695 -1021
  94. package/runtime/numbers.md +1098 -134
  95. package/runtime/string.gr +540 -242
  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
package/runtime/string.md CHANGED
@@ -1,24 +1,94 @@
1
- ### String.**StringList**
1
+ ---
2
+ title: String
3
+ ---
4
+
5
+ ## Values
6
+
7
+ Functions and constants included in the String module.
8
+
9
+ ### String.**concat**
10
+
11
+ <details disabled>
12
+ <summary tabindex="-1">Added in <code>0.2.0</code></summary>
13
+ No other changes yet.
14
+ </details>
2
15
 
3
16
  ```grain
4
- type StringList
17
+ concat : (str1: String, str2: String) => String
5
18
  ```
6
19
 
7
- ### String.**concat**
20
+ Concatenate two strings.
21
+
22
+ Parameters:
23
+
24
+ |param|type|description|
25
+ |-----|----|-----------|
26
+ |`str1`|`String`|The beginning string|
27
+ |`str2`|`String`|The ending string|
28
+
29
+ Returns:
30
+
31
+ |type|description|
32
+ |----|-----------|
33
+ |`String`|The combined string|
34
+
35
+ Examples:
8
36
 
9
37
  ```grain
10
- concat : (String, String) -> String
38
+ "Foo" ++ "Bar" == "FooBar"
11
39
  ```
12
40
 
13
41
  ### String.**toString**
14
42
 
43
+ <details disabled>
44
+ <summary tabindex="-1">Added in <code>0.1.0</code></summary>
45
+ No other changes yet.
46
+ </details>
47
+
15
48
  ```grain
16
- toString : a -> String
49
+ toString : (value: a) => String
17
50
  ```
18
51
 
52
+ Converts the given operand to a string.
53
+ Provides a better representation of data types if those types are provided from the module.
54
+
55
+ Parameters:
56
+
57
+ |param|type|description|
58
+ |-----|----|-----------|
59
+ |`value`|`a`|The operand|
60
+
61
+ Returns:
62
+
63
+ |type|description|
64
+ |----|-----------|
65
+ |`String`|The operand, as a string|
66
+
19
67
  ### String.**print**
20
68
 
69
+ <details disabled>
70
+ <summary tabindex="-1">Added in <code>0.1.0</code></summary>
71
+ No other changes yet.
72
+ </details>
73
+
74
+ ```grain
75
+ print : (value: a, ?suffix: String) => Void
76
+ ```
77
+
78
+ Prints the given operand to the console. Works for any type. Internally, calls `toString`
79
+ on the operand, so a better representation of data type will be printed if those types
80
+ are provided from the module.
81
+
82
+ Parameters:
83
+
84
+ |param|type|description|
85
+ |-----|----|-----------|
86
+ |`value`|`a`|The operand|
87
+ |`?suffix`|`String`|The string to print after the argument|
88
+
89
+ ### String.**getCodePoint**
90
+
21
91
  ```grain
22
- print : a -> Void
92
+ getCodePoint : (ptr: WasmI32) => WasmI32
23
93
  ```
24
94
 
@@ -1,17 +1,34 @@
1
- /* grainc-flags --compilation-mode=runtime */
1
+ @runtimeMode
2
+ module Constants
2
3
 
3
4
  // Signed/Unsigned Min/Max Constants
4
- export let _SMIN_I32 = 0xFFFFFFFFn
5
- export let _SMAX_I32 = 0x7FFFFFFFn
6
- export let _UMIN_I32 = 0x0n
7
- export let _UMAX_I32 = 0xFFFFFFFFn
5
+ provide let _SMIN_I32 = 0x80000000n
6
+ provide let _SMAX_I32 = 0x7FFFFFFFn
7
+ provide let _UMIN_I32 = 0x0n
8
+ provide let _UMAX_I32 = 0xFFFFFFFFn
8
9
 
9
- export let _SMIN_I64 = 0xFFFFFFFFFFFFFFFFN
10
- export let _SMAX_I64 = 0x7FFFFFFFFFFFFFFFN
11
- export let _UMIN_I64 = 0x0N
12
- export let _UMAX_I64 = 0xFFFFFFFFFFFFFFFFN
10
+ provide let _SMIN8_I32 = -0x7Fn
11
+ provide let _SMAX8_I32 = 0x7Fn
12
+ provide let _UMAX8_I32 = 0xFFn
13
13
 
14
- export let _SMIN32_I64 = -0x7FFFFFFFN
15
- export let _SMAX32_I64 = 0x7FFFFFFFN
16
- export let _UMIN32_I64 = 0x0N
17
- export let _UMAX32_I64 = 0xFFFFFFFFN
14
+ provide let _SMIN16_I32 = -0x7FFFn
15
+ provide let _SMAX16_I32 = 0x7FFFn
16
+ provide let _UMAX16_I32 = 0xFFFFn
17
+
18
+ provide let _SMIN_I64 = 0x8000000000000000N
19
+ provide let _SMAX_I64 = 0x7FFFFFFFFFFFFFFFN
20
+ provide let _UMIN_I64 = 0x0N
21
+ provide let _UMAX_I64 = 0xFFFFFFFFFFFFFFFFN
22
+
23
+ provide let _SMIN8_I64 = -0x7FN
24
+ provide let _SMAX8_I64 = 0x7FN
25
+ provide let _UMAX8_I64 = 0xFFN
26
+
27
+ provide let _SMIN16_I64 = -0x7FFFN
28
+ provide let _SMAX16_I64 = 0x7FFFN
29
+ provide let _UMAX16_I64 = 0xFFFFN
30
+
31
+ provide let _SMIN32_I64 = 0xFFFFFFFF80000000N
32
+ provide let _SMAX32_I64 = 0x7FFFFFFFN
33
+ provide let _UMIN32_I64 = 0x0N
34
+ provide let _UMAX32_I64 = 0xFFFFFFFFN
@@ -1,3 +1,11 @@
1
+ ---
2
+ title: Constants
3
+ ---
4
+
5
+ ## Values
6
+
7
+ Functions and constants included in the Constants module.
8
+
1
9
  ### Constants.**_SMIN_I32**
2
10
 
3
11
  ```grain
@@ -22,6 +30,42 @@ _UMIN_I32 : WasmI32
22
30
  _UMAX_I32 : WasmI32
23
31
  ```
24
32
 
33
+ ### Constants.**_SMIN8_I32**
34
+
35
+ ```grain
36
+ _SMIN8_I32 : WasmI32
37
+ ```
38
+
39
+ ### Constants.**_SMAX8_I32**
40
+
41
+ ```grain
42
+ _SMAX8_I32 : WasmI32
43
+ ```
44
+
45
+ ### Constants.**_UMAX8_I32**
46
+
47
+ ```grain
48
+ _UMAX8_I32 : WasmI32
49
+ ```
50
+
51
+ ### Constants.**_SMIN16_I32**
52
+
53
+ ```grain
54
+ _SMIN16_I32 : WasmI32
55
+ ```
56
+
57
+ ### Constants.**_SMAX16_I32**
58
+
59
+ ```grain
60
+ _SMAX16_I32 : WasmI32
61
+ ```
62
+
63
+ ### Constants.**_UMAX16_I32**
64
+
65
+ ```grain
66
+ _UMAX16_I32 : WasmI32
67
+ ```
68
+
25
69
  ### Constants.**_SMIN_I64**
26
70
 
27
71
  ```grain
@@ -46,6 +90,42 @@ _UMIN_I64 : WasmI64
46
90
  _UMAX_I64 : WasmI64
47
91
  ```
48
92
 
93
+ ### Constants.**_SMIN8_I64**
94
+
95
+ ```grain
96
+ _SMIN8_I64 : WasmI64
97
+ ```
98
+
99
+ ### Constants.**_SMAX8_I64**
100
+
101
+ ```grain
102
+ _SMAX8_I64 : WasmI64
103
+ ```
104
+
105
+ ### Constants.**_UMAX8_I64**
106
+
107
+ ```grain
108
+ _UMAX8_I64 : WasmI64
109
+ ```
110
+
111
+ ### Constants.**_SMIN16_I64**
112
+
113
+ ```grain
114
+ _SMIN16_I64 : WasmI64
115
+ ```
116
+
117
+ ### Constants.**_SMAX16_I64**
118
+
119
+ ```grain
120
+ _SMAX16_I64 : WasmI64
121
+ ```
122
+
123
+ ### Constants.**_UMAX16_I64**
124
+
125
+ ```grain
126
+ _UMAX16_I64 : WasmI64
127
+ ```
128
+
49
129
  ### Constants.**_SMIN32_I64**
50
130
 
51
131
  ```grain
@@ -1,66 +1,94 @@
1
- import WasmI32 from "runtime/unsafe/wasmi32"
2
- import WasmI64 from "runtime/unsafe/wasmi64"
3
- import WasmF32 from "runtime/unsafe/wasmf32"
4
- import WasmF64 from "runtime/unsafe/wasmf64"
5
- import {
1
+ module Conv
2
+
3
+ from "runtime/unsafe/wasmi32" include WasmI32
4
+ from "runtime/unsafe/wasmi64" include WasmI64
5
+ from "runtime/unsafe/wasmf32" include WasmF32
6
+ from "runtime/unsafe/wasmf64" include WasmF64
7
+ from "runtime/dataStructures" include DataStructures
8
+ use DataStructures.{
6
9
  newInt32,
10
+ newUint32,
7
11
  newInt64,
12
+ newUint64,
8
13
  newFloat32,
9
14
  newFloat64,
10
- } from "runtime/dataStructures"
15
+ }
11
16
 
12
17
  @unsafe
13
- export let toInt32 = n => {
18
+ provide let toInt32 = n => {
14
19
  WasmI32.toGrain(newInt32(n)): Int32
15
20
  }
16
21
 
17
22
  @unsafe
18
- export let fromInt32 = (n: Int32) => {
23
+ provide let toUint32 = n => {
24
+ WasmI32.toGrain(newUint32(n)): Uint32
25
+ }
26
+
27
+ @unsafe
28
+ provide let fromInt32 = (n: Int32) => {
29
+ let ptr = WasmI32.fromGrain(n)
30
+ WasmI32.load(ptr, 4n)
31
+ }
32
+
33
+ @unsafe
34
+ provide let fromUint32 = (n: Uint32) => {
19
35
  let ptr = WasmI32.fromGrain(n)
20
- WasmI32.load(ptr, 8n)
36
+ WasmI32.load(ptr, 4n)
21
37
  }
22
38
 
23
39
  @unsafe
24
- export let toInt64 = n => {
40
+ provide let toInt64 = n => {
25
41
  WasmI32.toGrain(newInt64(n)): Int64
26
42
  }
27
43
 
28
44
  @unsafe
29
- export let fromInt64 = (n: Int64) => {
45
+ provide let toUint64 = n => {
46
+ WasmI32.toGrain(newUint64(n)): Uint64
47
+ }
48
+
49
+ @unsafe
50
+ provide let fromInt64 = (n: Int64) => {
30
51
  let ptr = WasmI32.fromGrain(n)
31
52
  WasmI64.load(ptr, 8n)
32
53
  }
33
54
 
34
55
  @unsafe
35
- export let toFloat32 = n => {
56
+ provide let fromUint64 = (n: Uint64) => {
57
+ let ptr = WasmI32.fromGrain(n)
58
+ WasmI64.load(ptr, 8n)
59
+ }
60
+
61
+ @unsafe
62
+ provide let toFloat32 = n => {
36
63
  WasmI32.toGrain(newFloat32(n)): Float32
37
64
  }
38
65
 
39
66
  @unsafe
40
- export let fromFloat32 = (n: Float32) => {
67
+ provide let fromFloat32 = (n: Float32) => {
41
68
  let ptr = WasmI32.fromGrain(n)
42
- WasmF32.load(ptr, 8n)
69
+ WasmF32.load(ptr, 4n)
43
70
  }
44
71
 
45
72
  @unsafe
46
- export let toFloat64 = n => {
73
+ provide let toFloat64 = n => {
47
74
  WasmI32.toGrain(newFloat64(n)): Float64
48
75
  }
49
76
 
50
77
  @unsafe
51
- export let fromFloat64 = (n: Float64) => {
78
+ provide let fromFloat64 = (n: Float64) => {
52
79
  let ptr = WasmI32.fromGrain(n)
53
80
  WasmF64.load(ptr, 8n)
54
81
  }
55
82
 
56
83
  /**
57
84
  * Converts a WasmI32 value to Number.
58
- *
85
+ *
59
86
  * @param n: The WasmI32 to convert
60
87
  * @returns The value converted to either a simple or a 32 bit heap allocated number.
61
88
  */
62
89
  @unsafe
63
- export let wasmI32ToNumber = (n: WasmI32) => {
90
+ provide let wasmI32ToNumber = (n: WasmI32) => {
91
+ use WasmI32.{ (^), (<<), (>>), (==) }
64
92
  // Follows a little optimization. Instead of testing if n is range of allowed
65
93
  // non heap allocated simple numbers (-1073741824n..1073741823n), actually
66
94
  // make a simple number, convert it back to WasmI32, and test if it stayed
@@ -73,21 +101,20 @@ export let wasmI32ToNumber = (n: WasmI32) => {
73
101
 
74
102
  // First step: naively convert to simple number, just like tagSimpleNumber.
75
103
  // This will overflow for values not in the range, but it's fine.
76
- let simple = WasmI32.xor(WasmI32.shl(n, 1n), 1n)
104
+ let simple = n << 1n ^ 1n
77
105
 
78
106
  // Untag it, just like numbers.untagSimple.
79
- let untagged = WasmI32.shrS(simple, 1n)
107
+ let untagged = simple >> 1n
80
108
 
81
- let result = if (WasmI32.eq(untagged, n)) {
109
+ if (untagged == n) {
82
110
  // Just test if the untagged number is the same. If it didn't overflow, then
83
111
  // we're good. We just need to cast the raw value into a Number at the type
84
112
  // system level.
85
- WasmI32.toGrain(simple): Number
86
- } else {
87
- // If it did overflow, then the value differs and we need to discard it and
88
- // allocate the number on the heap. A boxed 32 bit number actually is the
89
- // same thing as an Int32. It only needs to be cast into Number.
90
- WasmI32.toGrain(newInt32(n)): Number
113
+ return WasmI32.toGrain(simple): Number
91
114
  }
92
- result
115
+
116
+ // If it did overflow, then the value differs and we need to discard it and
117
+ // allocate the number on the heap. We can do this by extending the 32 bit
118
+ // number to an Int64.
119
+ return WasmI32.toGrain(newInt64(WasmI64.extendI32S(n))): Number
93
120
  }
@@ -1,55 +1,87 @@
1
+ ---
2
+ title: Conv
3
+ ---
4
+
5
+ ## Values
6
+
7
+ Functions and constants included in the Conv module.
8
+
1
9
  ### Conv.**toInt32**
2
10
 
3
11
  ```grain
4
- toInt32 : WasmI32 -> Int32
12
+ toInt32 : (n: WasmI32) => Int32
13
+ ```
14
+
15
+ ### Conv.**toUint32**
16
+
17
+ ```grain
18
+ toUint32 : (n: WasmI32) => Uint32
5
19
  ```
6
20
 
7
21
  ### Conv.**fromInt32**
8
22
 
9
23
  ```grain
10
- fromInt32 : Int32 -> WasmI32
24
+ fromInt32 : (n: Int32) => WasmI32
25
+ ```
26
+
27
+ ### Conv.**fromUint32**
28
+
29
+ ```grain
30
+ fromUint32 : (n: Uint32) => WasmI32
11
31
  ```
12
32
 
13
33
  ### Conv.**toInt64**
14
34
 
15
35
  ```grain
16
- toInt64 : WasmI64 -> Int64
36
+ toInt64 : (n: WasmI64) => Int64
37
+ ```
38
+
39
+ ### Conv.**toUint64**
40
+
41
+ ```grain
42
+ toUint64 : (n: WasmI64) => Uint64
17
43
  ```
18
44
 
19
45
  ### Conv.**fromInt64**
20
46
 
21
47
  ```grain
22
- fromInt64 : Int64 -> WasmI64
48
+ fromInt64 : (n: Int64) => WasmI64
49
+ ```
50
+
51
+ ### Conv.**fromUint64**
52
+
53
+ ```grain
54
+ fromUint64 : (n: Uint64) => WasmI64
23
55
  ```
24
56
 
25
57
  ### Conv.**toFloat32**
26
58
 
27
59
  ```grain
28
- toFloat32 : WasmF32 -> Float32
60
+ toFloat32 : (n: WasmF32) => Float32
29
61
  ```
30
62
 
31
63
  ### Conv.**fromFloat32**
32
64
 
33
65
  ```grain
34
- fromFloat32 : Float32 -> WasmF32
66
+ fromFloat32 : (n: Float32) => WasmF32
35
67
  ```
36
68
 
37
69
  ### Conv.**toFloat64**
38
70
 
39
71
  ```grain
40
- toFloat64 : WasmF64 -> Float64
72
+ toFloat64 : (n: WasmF64) => Float64
41
73
  ```
42
74
 
43
75
  ### Conv.**fromFloat64**
44
76
 
45
77
  ```grain
46
- fromFloat64 : Float64 -> WasmF64
78
+ fromFloat64 : (n: Float64) => WasmF64
47
79
  ```
48
80
 
49
81
  ### Conv.**wasmI32ToNumber**
50
82
 
51
83
  ```grain
52
- wasmI32ToNumber : WasmI32 -> Number
84
+ wasmI32ToNumber : (n: WasmI32) => Number
53
85
  ```
54
86
 
55
87
  Converts a WasmI32 value to Number.
@@ -1,30 +1,14 @@
1
- /* grainc-flags --compilation-mode=runtime */
1
+ @runtimeMode
2
+ module Memory
2
3
 
3
- import {
4
- malloc,
5
- free,
6
- incRef,
7
- decRef,
8
- utoa32Buffered,
9
- decimalCount32,
10
- } from "runtime/gc"
11
- import WasmI32, {
12
- add as (+),
13
- sub as (-),
14
- shl as (<<),
15
- eq as (==),
16
- ne as (!=),
17
- ltU as (<),
18
- } from "runtime/unsafe/wasmi32"
4
+ from "runtime/gc" include GC
5
+ use GC.{ malloc, free, incRef, decRef }
6
+ from "runtime/unsafe/wasmi32" include WasmI32
7
+ use WasmI32.{ (+), (-), (<<), (==), (!=), ltU as (<) }
19
8
 
20
- export malloc
21
- export free
22
- export incRef
23
- export decRef
24
- export utoa32Buffered
25
- export decimalCount32
9
+ provide { malloc, free, incRef, decRef }
26
10
 
27
- export let copy = (dest, src, n) => {
11
+ provide let copy = (dest, src, n) => {
28
12
  let mut dest = dest
29
13
  let mut src = src
30
14
  let mut n = n
@@ -45,7 +29,7 @@ export let copy = (dest, src, n) => {
45
29
  }
46
30
  }
47
31
 
48
- export let fill = (dest, c, n) => {
32
+ provide let fill = (dest, c, n) => {
49
33
  let mut dest = dest
50
34
  let mut n = n
51
35
  while (n != 0n) {
@@ -55,8 +39,4 @@ export let fill = (dest, c, n) => {
55
39
  }
56
40
  }
57
41
 
58
- export primitive compare: (
59
- WasmI32,
60
- WasmI32,
61
- WasmI32,
62
- ) -> WasmI32 = "@wasm.memory_compare"
42
+ provide primitive compare = "@wasm.memory_compare"
@@ -1,54 +1,50 @@
1
+ ---
2
+ title: Memory
3
+ ---
4
+
5
+ ## Values
6
+
7
+ Functions and constants included in the Memory module.
8
+
1
9
  ### Memory.**malloc**
2
10
 
3
11
  ```grain
4
- malloc : WasmI32 -> WasmI32
12
+ malloc : (size: WasmI32) => WasmI32
5
13
  ```
6
14
 
7
15
  ### Memory.**free**
8
16
 
9
17
  ```grain
10
- free : WasmI32 -> Void
18
+ free : (userPtr: WasmI32) => Void
11
19
  ```
12
20
 
13
21
  ### Memory.**incRef**
14
22
 
15
23
  ```grain
16
- incRef : WasmI32 -> WasmI32
24
+ incRef : (userPtr: WasmI32) => WasmI32
17
25
  ```
18
26
 
19
27
  ### Memory.**decRef**
20
28
 
21
29
  ```grain
22
- decRef : WasmI32 -> WasmI32
23
- ```
24
-
25
- ### Memory.**utoa32Buffered**
26
-
27
- ```grain
28
- utoa32Buffered : Box<(WasmI32, WasmI32, WasmI32) -> Void>
29
- ```
30
-
31
- ### Memory.**decimalCount32**
32
-
33
- ```grain
34
- decimalCount32 : Box<WasmI32 -> WasmI32>
30
+ decRef : (userPtr: WasmI32) => WasmI32
35
31
  ```
36
32
 
37
33
  ### Memory.**copy**
38
34
 
39
35
  ```grain
40
- copy : (WasmI32, WasmI32, WasmI32) -> Void
36
+ copy : (dest: WasmI32, src: WasmI32, n: WasmI32) => Void
41
37
  ```
42
38
 
43
39
  ### Memory.**fill**
44
40
 
45
41
  ```grain
46
- fill : (WasmI32, WasmI32, WasmI32) -> Void
42
+ fill : (dest: WasmI32, c: WasmI32, n: WasmI32) => Void
47
43
  ```
48
44
 
49
45
  ### Memory.**compare**
50
46
 
51
47
  ```grain
52
- compare : (WasmI32, WasmI32, WasmI32) -> WasmI32
48
+ compare : (ptr1: WasmI32, ptr2: WasmI32, length: WasmI32) => WasmI32
53
49
  ```
54
50
 
@@ -1,26 +1,42 @@
1
- /* grainc-flags --compilation-mode=runtime */
1
+ @runtimeMode
2
+ module Tags
2
3
 
3
- export let _GRAIN_NUMBER_TAG_TYPE = 0b0001n
4
- export let _GRAIN_CHAR_TAG_TYPE = 0b0010n
5
- export let _GRAIN_CONST_TAG_TYPE = 0b0110n
6
- export let _GRAIN_GENERIC_HEAP_TAG_TYPE = 0b0000n
4
+ provide let _GRAIN_NUMBER_TAG_TYPE = 0b0001n
5
+ provide let _GRAIN_SHORTVAL_TAG_TYPE = 0b0010n
6
+ provide let _GRAIN_CONST_TAG_TYPE = 0b0110n
7
+ provide let _GRAIN_GENERIC_HEAP_TAG_TYPE = 0b0000n
7
8
 
8
- export let _GRAIN_NUMBER_TAG_MASK = 0b0001n
9
- export let _GRAIN_GENERIC_TAG_MASK = 0b0111n
9
+ provide let _GRAIN_NUMBER_TAG_MASK = 0b0001n
10
+ provide let _GRAIN_GENERIC_TAG_MASK = 0b0111n
10
11
 
11
- export let _GRAIN_STRING_HEAP_TAG = 1n
12
- export let _GRAIN_ADT_HEAP_TAG = 2n
13
- export let _GRAIN_RECORD_HEAP_TAG = 3n
14
- export let _GRAIN_ARRAY_HEAP_TAG = 4n
15
- export let _GRAIN_BOXED_NUM_HEAP_TAG = 5n
16
- export let _GRAIN_LAMBDA_HEAP_TAG = 6n
17
- export let _GRAIN_TUPLE_HEAP_TAG = 7n
18
- export let _GRAIN_BYTES_HEAP_TAG = 8n
12
+ // Short val types
13
+ provide let _GRAIN_CHAR_SHORTVAL_TAG = 0n
14
+ provide let _GRAIN_INT8_SHORTVAL_TAG = 1n
15
+ provide let _GRAIN_INT16_SHORTVAL_TAG = 2n
16
+ provide let _GRAIN_UINT8_SHORTVAL_TAG = 3n
17
+ provide let _GRAIN_UINT16_SHORTVAL_TAG = 4n
18
+
19
+ provide let _GRAIN_GENERIC_SHORTVAL_TAG_MASK = 0b11111000n
20
+ provide let _GRAIN_INT8_TAG_MASK = 0b1000n
21
+ provide let _GRAIN_INT16_TAG_MASK = 0b10000n
22
+ provide let _GRAIN_UINT8_TAG_MASK = 0b11000n
23
+ provide let _GRAIN_UINT16_TAG_MASK = 0b100000n
24
+
25
+ provide let _GRAIN_STRING_HEAP_TAG = 1n
26
+ provide let _GRAIN_ADT_HEAP_TAG = 2n
27
+ provide let _GRAIN_RECORD_HEAP_TAG = 3n
28
+ provide let _GRAIN_ARRAY_HEAP_TAG = 4n
29
+ provide let _GRAIN_BOXED_NUM_HEAP_TAG = 5n
30
+ provide let _GRAIN_LAMBDA_HEAP_TAG = 6n
31
+ provide let _GRAIN_TUPLE_HEAP_TAG = 7n
32
+ provide let _GRAIN_BYTES_HEAP_TAG = 8n
33
+ provide let _GRAIN_INT32_HEAP_TAG = 9n
34
+ provide let _GRAIN_FLOAT32_HEAP_TAG = 10n
35
+ provide let _GRAIN_UINT32_HEAP_TAG = 11n
36
+ provide let _GRAIN_UINT64_HEAP_TAG = 12n
19
37
 
20
38
  // Boxed number types
21
- export let _GRAIN_FLOAT32_BOXED_NUM_TAG = 1n
22
- export let _GRAIN_FLOAT64_BOXED_NUM_TAG = 2n
23
- export let _GRAIN_INT32_BOXED_NUM_TAG = 3n
24
- export let _GRAIN_INT64_BOXED_NUM_TAG = 4n
25
- export let _GRAIN_RATIONAL_BOXED_NUM_TAG = 5n
26
- export let _GRAIN_BIGINT_BOXED_NUM_TAG = 6n
39
+ provide let _GRAIN_FLOAT64_BOXED_NUM_TAG = 1n
40
+ provide let _GRAIN_INT64_BOXED_NUM_TAG = 2n
41
+ provide let _GRAIN_RATIONAL_BOXED_NUM_TAG = 3n
42
+ provide let _GRAIN_BIGINT_BOXED_NUM_TAG = 4n