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.
- package/CHANGELOG.md +10 -0
- package/README.md +1 -1
- package/crypto/README.md +3 -0
- package/{prime_field → crypto/prime_field}/module.f.mjs +2 -2
- package/{secp → crypto/secp}/module.f.mjs +2 -2
- package/{sha2 → crypto/sha2}/module.f.mjs +4 -4
- package/{sha2 → crypto/sha2}/test.f.mjs +2 -2
- package/djs/module.f.mjs +4 -1
- package/djs/parser/module.f.mjs +122 -45
- package/djs/parser/test.f.mjs +30 -4
- package/djs/tokenizer/module.f.mjs +6 -2
- package/djs/tokenizer/test.f.mjs +34 -0
- package/html/README.md +10 -9
- package/html/module.f.mjs +18 -33
- package/html/test.f.mjs +6 -6
- package/issues/05-publish.md +17 -22
- package/issues/README.md +13 -2
- package/js/tokenizer/module.f.mjs +75 -26
- package/js/tokenizer/test.f.mjs +42 -0
- package/json/parser/test.f.mjs +6 -0
- package/jsr.json +4 -4
- package/nanvm-lib/src/extension.rs +1 -1
- package/nanvm-lib/src/nanenum.rs +22 -20
- package/out/{prime_field → crypto/prime_field}/module.f.d.mts +1 -1
- package/out/{prime_field → crypto/prime_field}/module.f.mjs +2 -2
- package/out/{secp → crypto/secp}/module.f.d.mts +1 -1
- package/out/{secp → crypto/secp}/module.f.mjs +2 -2
- package/out/{sha2 → crypto/sha2}/module.f.d.mts +3 -3
- package/out/{sha2 → crypto/sha2}/module.f.mjs +4 -4
- package/out/{sha2 → crypto/sha2}/test.f.mjs +2 -2
- package/out/djs/module.f.d.mts +1 -1
- package/out/djs/module.f.mjs +5 -1
- package/out/djs/parser/module.f.d.mts +1 -1
- package/out/djs/parser/module.f.mjs +105 -89
- package/out/djs/parser/test.f.d.mts +1 -0
- package/out/djs/parser/test.f.mjs +38 -4
- package/out/djs/tokenizer/module.f.d.mts +2 -2
- package/out/djs/tokenizer/module.f.mjs +6 -2
- package/out/djs/tokenizer/test.f.d.mts +1 -0
- package/out/djs/tokenizer/test.f.mjs +50 -0
- package/out/html/module.f.d.mts +8 -6
- package/out/html/module.f.mjs +17 -31
- package/out/html/test.f.mjs +5 -5
- package/out/js/tokenizer/module.f.d.mts +15 -3
- package/out/js/tokenizer/module.f.mjs +65 -22
- package/out/js/tokenizer/test.f.d.mts +1 -0
- package/out/js/tokenizer/test.f.mjs +62 -0
- package/out/json/parser/test.f.mjs +8 -0
- package/out/types/bit_vec/module.f.d.mts +108 -22
- package/out/types/bit_vec/module.f.mjs +142 -31
- package/out/types/bit_vec/test.f.d.mts +20 -6
- package/out/types/bit_vec/test.f.mjs +160 -10
- package/package.json +1 -1
- package/types/bit_vec/README.md +18 -0
- package/types/bit_vec/module.f.mjs +147 -31
- package/types/bit_vec/test.f.mjs +101 -13
- /package/{prime_field → crypto/prime_field}/test.f.mjs +0 -0
- /package/{secp → crypto/secp}/test.f.mjs +0 -0
- /package/out/{prime_field → crypto/prime_field}/test.f.d.mts +0 -0
- /package/out/{prime_field → crypto/prime_field}/test.f.mjs +0 -0
- /package/out/{secp → crypto/secp}/test.f.d.mts +0 -0
- /package/out/{secp → crypto/secp}/test.f.mjs +0 -0
- /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
|
|
19
|
+
export const length = log2
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
|
-
*
|
|
22
|
+
* Creates a vector of bits of the given `len` and the given unsigned integer.
|
|
22
23
|
*
|
|
23
|
-
* @type {(
|
|
24
|
+
* @type {(len: bigint) => (ui: bigint) => Vec}
|
|
24
25
|
*
|
|
25
26
|
* @example
|
|
26
27
|
*
|
|
27
28
|
* ```js
|
|
28
|
-
* const
|
|
29
|
-
* const
|
|
30
|
-
* const
|
|
29
|
+
* const vec4 = vec(4n)
|
|
30
|
+
* const v0 = vec4(5n) // 0x15n
|
|
31
|
+
* const v1 = vec4(0x5FEn) // 0x1En
|
|
31
32
|
* ```
|
|
32
33
|
*/
|
|
33
|
-
export const
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
*
|
|
45
|
+
* Returns the unsigned integer of the given vector by removing a stop bit.
|
|
40
46
|
*
|
|
41
|
-
* @type {(
|
|
47
|
+
* @type {(len: Vec) => bigint}
|
|
42
48
|
*
|
|
43
49
|
* @example
|
|
44
50
|
*
|
|
45
51
|
* ```js
|
|
46
|
-
* const
|
|
47
|
-
* const
|
|
52
|
+
* const vector = vec(8n)(0x5n) // 0x105n
|
|
53
|
+
* const result = uint(vector); // result is 0x5n
|
|
48
54
|
* ```
|
|
49
55
|
*/
|
|
50
|
-
export const
|
|
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
|
-
*
|
|
59
|
+
* Extract the least significant unsigned integer from the given vector.
|
|
58
60
|
*
|
|
59
|
-
* @type {(
|
|
61
|
+
* @type {(uintLen: bigint) => (v: Vec) => bigint}
|
|
60
62
|
*
|
|
61
63
|
* @example
|
|
62
64
|
*
|
|
63
65
|
* ```js
|
|
64
|
-
* const
|
|
65
|
-
* const
|
|
66
|
-
* const
|
|
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
|
|
71
|
-
const
|
|
72
|
-
return
|
|
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(
|
|
84
|
-
* const r =
|
|
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
|
|
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)
|
package/types/bit_vec/test.f.mjs
CHANGED
|
@@ -1,41 +1,129 @@
|
|
|
1
|
-
import { empty,
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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)
|
|
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 =
|
|
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 (
|
|
23
|
-
const u =
|
|
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 =
|
|
118
|
+
const ab = concatLsb(a)(b)
|
|
31
119
|
if (ab !== 0x18945n) { throw ab }
|
|
32
|
-
const s =
|
|
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 =
|
|
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
|
|
File without changes
|
|
File without changes
|