functionalscript 0.2.4 → 0.2.6

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 (63) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +1 -1
  3. package/crypto/README.md +3 -0
  4. package/{prime_field → crypto/prime_field}/module.f.mjs +2 -2
  5. package/{secp → crypto/secp}/module.f.mjs +2 -2
  6. package/{sha2 → crypto/sha2}/module.f.mjs +4 -4
  7. package/{sha2 → crypto/sha2}/test.f.mjs +2 -2
  8. package/djs/module.f.mjs +4 -1
  9. package/djs/parser/module.f.mjs +122 -45
  10. package/djs/parser/test.f.mjs +30 -4
  11. package/djs/tokenizer/module.f.mjs +6 -2
  12. package/djs/tokenizer/test.f.mjs +34 -0
  13. package/html/README.md +10 -9
  14. package/html/module.f.mjs +18 -33
  15. package/html/test.f.mjs +6 -6
  16. package/issues/05-publish.md +17 -22
  17. package/issues/README.md +13 -2
  18. package/js/tokenizer/module.f.mjs +75 -26
  19. package/js/tokenizer/test.f.mjs +42 -0
  20. package/json/parser/test.f.mjs +6 -0
  21. package/jsr.json +4 -4
  22. package/nanvm-lib/src/extension.rs +1 -1
  23. package/nanvm-lib/src/nanenum.rs +22 -20
  24. package/out/{prime_field → crypto/prime_field}/module.f.d.mts +1 -1
  25. package/out/{prime_field → crypto/prime_field}/module.f.mjs +2 -2
  26. package/out/{secp → crypto/secp}/module.f.d.mts +1 -1
  27. package/out/{secp → crypto/secp}/module.f.mjs +2 -2
  28. package/out/{sha2 → crypto/sha2}/module.f.d.mts +3 -3
  29. package/out/{sha2 → crypto/sha2}/module.f.mjs +4 -4
  30. package/out/{sha2 → crypto/sha2}/test.f.mjs +2 -2
  31. package/out/djs/module.f.d.mts +1 -1
  32. package/out/djs/module.f.mjs +5 -1
  33. package/out/djs/parser/module.f.d.mts +1 -1
  34. package/out/djs/parser/module.f.mjs +105 -89
  35. package/out/djs/parser/test.f.d.mts +1 -0
  36. package/out/djs/parser/test.f.mjs +38 -4
  37. package/out/djs/tokenizer/module.f.d.mts +2 -2
  38. package/out/djs/tokenizer/module.f.mjs +6 -2
  39. package/out/djs/tokenizer/test.f.d.mts +1 -0
  40. package/out/djs/tokenizer/test.f.mjs +50 -0
  41. package/out/html/module.f.d.mts +8 -6
  42. package/out/html/module.f.mjs +17 -31
  43. package/out/html/test.f.mjs +5 -5
  44. package/out/js/tokenizer/module.f.d.mts +15 -3
  45. package/out/js/tokenizer/module.f.mjs +65 -22
  46. package/out/js/tokenizer/test.f.d.mts +1 -0
  47. package/out/js/tokenizer/test.f.mjs +62 -0
  48. package/out/json/parser/test.f.mjs +8 -0
  49. package/out/types/bit_vec/module.f.d.mts +108 -22
  50. package/out/types/bit_vec/module.f.mjs +142 -31
  51. package/out/types/bit_vec/test.f.d.mts +20 -6
  52. package/out/types/bit_vec/test.f.mjs +160 -10
  53. package/package.json +1 -1
  54. package/types/bit_vec/README.md +18 -0
  55. package/types/bit_vec/module.f.mjs +147 -31
  56. package/types/bit_vec/test.f.mjs +101 -13
  57. /package/{prime_field → crypto/prime_field}/test.f.mjs +0 -0
  58. /package/{secp → crypto/secp}/test.f.mjs +0 -0
  59. /package/out/{prime_field → crypto/prime_field}/test.f.d.mts +0 -0
  60. /package/out/{prime_field → crypto/prime_field}/test.f.mjs +0 -0
  61. /package/out/{secp → crypto/secp}/test.f.d.mts +0 -0
  62. /package/out/{secp → crypto/secp}/test.f.mjs +0 -0
  63. /package/out/{sha2 → crypto/sha2}/test.f.d.mts +0 -0
@@ -1,5 +1,6 @@
1
1
  // @ts-self-types="./module.f.d.mts"
2
2
  import { log2 } from '../bigint/module.f.mjs'
3
+ import { flip } from '../function/module.f.mjs'
3
4
 
4
5
  /**
5
6
  * A vector of bits represented as a `bigint`.
@@ -15,76 +16,191 @@ export const empty = 1n
15
16
  /**
16
17
  * Calculates the length of the given vector of bits.
17
18
  */
18
- export const len = log2
19
+ export const length = log2
19
20
 
20
21
  /**
21
- * Extract an unsigned integer of the given `uintLen` from the given vector.
22
+ * Creates a vector of bits of the given `len` and the given unsigned integer.
22
23
  *
23
- * @type {(uintLen: bigint) => (v: Vec) => bigint}
24
+ * @type {(len: bigint) => (ui: bigint) => Vec}
24
25
  *
25
26
  * @example
26
27
  *
27
28
  * ```js
28
- * const vector = 0b110101n;
29
- * const extract3Bits = uint(3n);
30
- * const result = extract3Bits(vector); // result is 0b101n (5n)
29
+ * const vec4 = vec(4n)
30
+ * const v0 = vec4(5n) // 0x15n
31
+ * const v1 = vec4(0x5FEn) // 0x1En
31
32
  * ```
32
33
  */
33
- export const uint = uintLen => {
34
- const mask = (1n << uintLen) - 1n
35
- return data => data & mask
34
+ export const vec = len => {
35
+ if (len <= 0n) { return () => empty }
36
+ const stop = 1n << len
37
+ const mask = stop - 1n
38
+ return data => stop | (data & mask)
36
39
  }
37
40
 
41
+ /** @type {(len: bigint) => bigint} */
42
+ const mask = len => (1n << len) - 1n
43
+
38
44
  /**
39
- * Creates a vector of bits of the given `vecLen` from the given unsigned integer.
45
+ * Returns the unsigned integer of the given vector by removing a stop bit.
40
46
  *
41
- * @type {(vecLen: bigint) => (ui: bigint) => Vec}
47
+ * @type {(len: Vec) => bigint}
42
48
  *
43
49
  * @example
44
50
  *
45
51
  * ```js
46
- * const createVector = vec(4n);
47
- * const vector = createVector(5n); // vector is 0b10101n
52
+ * const vector = vec(8n)(0x5n) // 0x105n
53
+ * const result = uint(vector); // result is 0x5n
48
54
  * ```
49
55
  */
50
- export const vec = vecLen => {
51
- const stop = 1n << vecLen
52
- const mask = stop - 1n
53
- return data => (data & mask) | stop
54
- }
56
+ export const uint = v => v ^ (1n << length(v))
55
57
 
56
58
  /**
57
- * Appends the vector `b` to the back of the vector `a`.
59
+ * Extract the least significant unsigned integer from the given vector.
58
60
  *
59
- * @type {(a: Vec) => (b: Vec) => Vec}
61
+ * @type {(uintLen: bigint) => (v: Vec) => bigint}
60
62
  *
61
63
  * @example
62
64
  *
63
65
  * ```js
64
- * const vec8 = vec(8n)
65
- * const a = vec8(0x345n)
66
- * const b = vec8(0x789n)
67
- * const ab = appendBack(a)(b) // 0x18945n
66
+ * const vector = vec(8n)(0xF5n) // 0x1F5n
67
+ * const result = uintLsb(4n)(vector); // result is 5n
68
+ * const result2 = uintLsb(16n)(vector); // result2 is 0xF5n
68
69
  * ```
69
70
  */
70
- export const appendBack = a => {
71
- const aLen = len(a)
72
- return b => a | (b << aLen)
71
+ export const uintLsb = len => {
72
+ const m = mask(len)
73
+ return v => {
74
+ const result = v & m
75
+ return result === v ? uint(v) : result
76
+ }
73
77
  }
74
78
 
75
79
  /**
76
- * Removes the first `len` bits from the given vector.
80
+ * Removes the first `len` least significant bits from the given vector.
77
81
  *
78
82
  * @type {(len: bigint) => (v: Vec) => Vec}
79
83
  *
80
84
  * @example
81
85
  *
82
86
  * ```js
83
- * const v = vec(17n)(0x12345n) // v = 0x32345n
84
- * const r = removeFront(9n)(v) // r = 0x191n
87
+ * const v = vec(16n)(0x3456n) // 0x13456n
88
+ * const r = removeLsb(4n)(v) // 0x1345n
89
+ * const r2 = removeLsb(24n)(v) // 0x1n
85
90
  * ```
86
91
  */
87
- export const removeFront = len => v => {
92
+ export const removeLsb = len => v => {
88
93
  const r = v >> len
89
94
  return r === 0n ? empty : r
90
95
  }
96
+
97
+ /**
98
+ * Extracts the least significant unsigned integer and removes it from the vector.
99
+ *
100
+ * @type {(len: bigint) => (v: Vec) => [bigint, Vec]}
101
+ *
102
+ * @example
103
+ *
104
+ * ```js
105
+ * const vector = vec(8n)(0xF5n) // 0x1F5n
106
+ * const [result, rest] = popUintLsb(4n)(vector); // result is 5n, rest is 0x1Fn
107
+ * const [result2, rest2] = popUintLsb(16n)(vector); // result2 is 0xF5n, rest2 is 1n
108
+ * ```
109
+ */
110
+ export const popUintLsb = len => {
111
+ const m = mask(len)
112
+ return v => {
113
+ const result = v & m
114
+ return result === v ? [uint(v), empty] : [result, v >> len]
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Extract the most significant unsigned integer of the given `len` from the given vector.
120
+ *
121
+ * @type {(len: bigint) => (v: Vec) => bigint}
122
+ *
123
+ * @example
124
+ *
125
+ * ```js
126
+ * const vector = vec(8n)(0xF5n) // 0x1F5n
127
+ * const result = uintMsb(4n)(vector); // result is 0xFn
128
+ * const result2 = uintMsb(16n)(vector); // result2 is 0xF500n
129
+ * ```
130
+ */
131
+ export const uintMsb = len => {
132
+ const m = mask(len)
133
+ return v => (v >> (length(v) - len)) & m
134
+ }
135
+
136
+ /**
137
+ * Removes the first `len` most significant bits from the given vector.
138
+ *
139
+ * @type {(len: bigint) => (v: Vec) => Vec}
140
+ *
141
+ * @example
142
+ *
143
+ * ```js
144
+ * const v = vec(16n)(0x3456n) // 0x13456n
145
+ * const r = removeMsb(4n)(v) // 0x1456n
146
+ * const r2 = removeMsb(24n)(v) // 0x1n
147
+ * ```
148
+ */
149
+ export const removeMsb = len => v => vec(length(v) - len)(v)
150
+
151
+ /**
152
+ * Extracts the most significant unsigned integer and removes it from the vector.
153
+ *
154
+ * @type {(len: bigint) => (v: Vec) => [bigint, Vec]}
155
+ *
156
+ * @example
157
+ *
158
+ * ```js
159
+ * const vector = vec(8n)(0xF5n) // 0x1F5n
160
+ * const [result, rest] = popUintMsb(4n)(vector); // [0xFn, 0x15n]
161
+ * const [result2, rest2] = popUintMsb(16n)(vector); // [0xF500n, 1n]
162
+ * ```
163
+ */
164
+ export const popUintMsb = len => {
165
+ const m = mask(len)
166
+ return v => {
167
+ const d = length(v) - len
168
+ return [(v >> d) & m, vec(d)(v)]
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Concat the given vectors of bits. The first vector is the least significant.
174
+ *
175
+ * @type {(a: Vec) => (b: Vec) => Vec}
176
+ *
177
+ * @example
178
+ *
179
+ * ```js
180
+ * const u8 = vec(8n)
181
+ * const a = u8(0x45n) // 0x145n
182
+ * const b = u8(0x89n) // 0x189n
183
+ * const ab = concatLsb(a)(b) // 0x18945n
184
+ * ```
185
+ */
186
+ export const concatLsb = a => {
187
+ const aLen = length(a)
188
+ const m = mask(aLen)
189
+ return b => (b << aLen) | (a & m)
190
+ }
191
+
192
+ /**
193
+ * Concat the given vectors of bits. The first vector is the most significant.
194
+ *
195
+ * @type {(b: Vec) => (a: Vec) => Vec}
196
+ *
197
+ * @example
198
+ *
199
+ * ```js
200
+ * const u8 = vec(8n)
201
+ * const a = u8(0x45n) // 0x145n
202
+ * const b = u8(0x89n) // 0x189n
203
+ * const ab = concatMsb(a)(b) // 0x14589n
204
+ * ```
205
+ */
206
+ export const concatMsb = flip(concatLsb)
@@ -1,41 +1,129 @@
1
- import { empty, len, appendBack, vec, uint, removeFront } from './module.f.mjs'
1
+ import { empty, vec, length, concatLsb, uintLsb, uintMsb, removeLsb, concatMsb, removeMsb, uint, popUintLsb, popUintMsb } from './module.f.mjs'
2
2
 
3
3
  export default {
4
- uintExample: () => {
5
- const vector = 0b110101n;
6
- const extract3Bits = uint(3n);
7
- const result = extract3Bits(vector); // result is 0b101n (5n)
4
+ examples: {
5
+ vec: () => {
6
+ const vec4 = vec(4n)
7
+ const v0 = vec4(5n) // 0x15n
8
+ if (v0 !== 0x15n) { throw v0 }
9
+ const v1 = vec4(0x5FEn) // 0x1En
10
+ if (v1 !== 0x1En) { throw v1 }
11
+ },
12
+ uint: () => {
13
+ const vector = vec(8n)(0x5n) // 0x105n
14
+ if (vector !== 0x105n) { throw vector }
15
+ const result = uint(vector); // result is 0x5n
16
+ if (result !== 0x5n) { throw result }
17
+ },
18
+ uintLsb: () => {
19
+ const vector = vec(8n)(0xF5n) // 0x1F5n
20
+ if (vector !== 0x1F5n) { throw vector }
21
+ const result = uintLsb(4n)(vector); // result is 5n
22
+ if (result !== 5n) { throw result }
23
+ const result2 = uintLsb(16n)(vector); // result2 is 0xF5n
24
+ if (result2 !== 0xF5n) { throw result2 }
25
+ },
26
+ uintMsb: () => {
27
+ const vector = vec(8n)(0xF5n) // 0x1F5n
28
+ if (vector !== 0x1F5n) { throw vector }
29
+ const result = uintMsb(4n)(vector); // result is 0xFn
30
+ if (result !== 0xFn) { throw result }
31
+ const result2 = uintMsb(16n)(vector); // result2 is 0xF500n
32
+ if (result2 !== 0xF500n) { throw result2 }
33
+ },
34
+ popUintLsb: () => {
35
+ const vector = vec(8n)(0xF5n) // 0x1F5n
36
+ const [result, rest] = popUintLsb(4n)(vector); // result is 5n, rest is 0x1Fn
37
+ if (result !== 5n) { throw result }
38
+ if (rest !== 0x1Fn) { throw rest }
39
+ const [result2, rest2] = popUintLsb(16n)(vector); // result2 is 0xF5n, rest2 is 1n
40
+ if (result2 !== 0xF5n) { throw result2 }
41
+ if (rest2 !== 1n) { throw rest2 }
42
+ },
43
+ popUintMsb: () => {
44
+ const vector = vec(8n)(0xF5n) // 0x1F5n
45
+ const [result, rest] = popUintMsb(4n)(vector); // [0xFn, 0x15n]
46
+ if (result !== 0xFn) { throw result }
47
+ if (rest !== 0x15n) { throw rest }
48
+ const [result2, rest2] = popUintMsb(16n)(vector); // [0xF500n, 1n]
49
+ if (result2 !== 0xF500n) { throw result2 }
50
+ if (rest2 !== 1n) { throw rest2 }
51
+ },
52
+ concatLsb: () => {
53
+ const u8 = vec(8n)
54
+ const a = u8(0x45n) // 0x145n
55
+ if (a !== 0x145n) { throw a }
56
+ const b = u8(0x89n) // 0x189n
57
+ if (b !== 0x189n) { throw b }
58
+ const ab = concatLsb(a)(b) // 0x18945n
59
+ if (ab !== 0x18945n) { throw ab }
60
+ },
61
+ concatMsb: () => {
62
+ const u8 = vec(8n)
63
+ const a = u8(0x45n) // 0x145n
64
+ if (a !== 0x145n) { throw a }
65
+ const b = u8(0x89n) // 0x189n
66
+ if (b !== 0x189n) { throw b }
67
+ const ab = concatMsb(a)(b) // 0x14589n
68
+ if (ab !== 0x14589n) { throw ab }
69
+ },
70
+ removeLsb: () => {
71
+ const v = vec(16n)(0x3456n) // 0x13456n
72
+ if (v !== 0x13456n) { throw v }
73
+ const r = removeLsb(4n)(v) // 0x1345n
74
+ if (r !== 0x1345n) { throw r }
75
+ const r2 = removeLsb(24n)(v) // 0x1n
76
+ if (r2 !== 0x1n) { throw r2 }
77
+ },
78
+ removeMsb: () => {
79
+ const v = vec(16n)(0x3456n) // 0x13456n
80
+ if (v !== 0x13456n) { throw v }
81
+ const r = removeMsb(4n)(v) // 0x1456n
82
+ if (r !== 0x1456n) { throw r }
83
+ const r2 = removeMsb(24n)(v) // 0x1n
84
+ if (r2 !== 0x1n) { throw r2 }
85
+ }
86
+ },
87
+ uintLsb: () => {
88
+ const vector = 0b1110101n
89
+ const extract3Bits = uintLsb(3n)
90
+ const result = extract3Bits(vector) // result is 0b101n (5n)
8
91
  if (result !== 0b101n) { throw result }
9
92
  },
93
+ uintSmall: () => {
94
+ const vector = 0b11n
95
+ const extract3Bits = uintLsb(3n)(vector)
96
+ if (extract3Bits !== 0b1n) { throw extract3Bits }
97
+ },
10
98
  vecExample: () => {
11
- const createVector = vec(4n);
12
- const vector = createVector(5n); // vector is 0b10101n
99
+ const createVector = vec(4n)
100
+ const vector = createVector(5n) // vector is 0b10101n
13
101
  if (vector !== 0b10101n) { throw vector }
14
102
  },
15
103
  length: () => {
16
- const i = len(empty)
104
+ const i = length(empty)
17
105
  if (i !== 0n) { throw i}
18
106
  },
19
107
  bitset: () => {
20
108
  const v = vec(8n)(0x5FEn)
21
109
  if (v !== 0x1FEn) { throw v }
22
- if (len(v) !== 8n) { throw 'len' }
23
- const u = uint(8n)(v)
110
+ if (length(v) !== 8n) { throw 'len' }
111
+ const u = uintLsb(8n)(v)
24
112
  if (u !== 0xFEn) { throw v }
25
113
  },
26
114
  appendBack: () => {
27
115
  const vec8 = vec(8n)
28
116
  const a = vec8(0x345n)
29
117
  const b = vec8(0x789n)
30
- const ab = appendBack(a)(b)
118
+ const ab = concatLsb(a)(b)
31
119
  if (ab !== 0x18945n) { throw ab }
32
- const s = len(ab)
120
+ const s = length(ab)
33
121
  if (s !== 16n) { throw `appendBack: ${s}` }
34
122
  },
35
123
  removeBack: () => {
36
124
  const v = vec(17n)(0x12345n)
37
125
  if (v !== 0x32345n) { throw v.toString(16) }
38
- const r = removeFront(9n)(v)
126
+ const r = removeLsb(9n)(v)
39
127
  if (r !== 0x191n) { throw r.toString(16) }
40
128
  }
41
129
  }
File without changes
File without changes
File without changes
File without changes
File without changes