functionalscript 0.8.0 → 0.8.2
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/bnf/data/module.f.d.ts +6 -0
- package/bnf/data/module.f.js +57 -4
- package/bnf/data/test.f.d.ts +1 -0
- package/bnf/data/test.f.js +67 -1
- package/ci/module.f.d.ts +3 -0
- package/ci/module.f.js +169 -0
- package/ci/module.js +3 -0
- package/crypto/hmac/module.f.d.ts +5 -4
- package/crypto/hmac/module.f.js +9 -18
- package/crypto/hmac/test.f.d.ts +1 -0
- package/crypto/hmac/test.f.js +16 -8
- package/crypto/secp/module.f.d.ts +14 -11
- package/crypto/secp/module.f.js +33 -13
- package/crypto/secp/test.f.js +12 -13
- package/crypto/sha2/module.f.d.ts +11 -5
- package/crypto/sha2/module.f.js +4 -3
- package/crypto/sha2/test.f.d.ts +4 -1
- package/crypto/sha2/test.f.js +41 -31
- package/crypto/sign/module.f.d.ts +17 -4
- package/crypto/sign/module.f.js +141 -46
- package/crypto/sign/test.f.d.ts +11 -1
- package/crypto/sign/test.f.js +631 -1
- package/dev/tf/all.test.js +9 -1
- package/djs/ast/module.f.d.ts +3 -3
- package/djs/ast/test.f.js +7 -8
- package/djs/parser/module.f.d.ts +3 -3
- package/djs/parser/module.f.js +4 -4
- package/djs/parser/test.f.js +76 -77
- package/djs/serializer/module.f.d.ts +8 -8
- package/djs/serializer/module.f.js +4 -7
- package/djs/serializer/test.f.js +8 -9
- package/djs/tokenizer/module.f.d.ts +2 -2
- package/djs/tokenizer/module.f.js +3 -5
- package/djs/tokenizer/test.f.js +8 -10
- package/djs/transpiler/module.f.d.ts +3 -3
- package/djs/transpiler/module.f.js +2 -0
- package/fsc/bnf.f.d.ts +1 -1
- package/fsc/bnf.f.js +39 -51
- package/fsc/json.f.d.ts +1 -1
- package/fsc/json.f.js +56 -81
- package/fsc/test.f.js +4 -6
- package/fsm/module.f.js +3 -3
- package/fsm/test.f.js +21 -25
- package/html/module.f.js +17 -4
- package/html/test.f.d.ts +7 -0
- package/html/test.f.js +37 -0
- package/issues/031-json.f.d.ts +1 -0
- package/js/tokenizer/module.f.d.ts +4 -4
- package/js/tokenizer/module.f.js +12 -17
- package/js/tokenizer/test.f.js +9 -11
- package/json/module.f.d.ts +6 -6
- package/json/module.f.js +5 -10
- package/json/parser/module.f.d.ts +4 -4
- package/json/parser/module.f.js +7 -4
- package/json/parser/test.f.js +47 -49
- package/json/serializer/module.f.d.ts +6 -6
- package/json/serializer/module.f.js +3 -2
- package/json/serializer/test.f.js +13 -13
- package/json/test.f.js +13 -15
- package/json/tokenizer/module.f.d.ts +4 -4
- package/json/tokenizer/module.f.js +6 -7
- package/json/tokenizer/test.f.js +7 -9
- package/nanvm-lib/tests/vm/test.f.js +1 -1
- package/package.json +5 -5
- package/path/module.f.d.ts +3 -2
- package/text/ascii/test.f.js +2 -2
- package/text/module.f.d.ts +3 -2
- package/text/module.f.js +2 -2
- package/text/test.f.js +3 -3
- package/text/utf16/test.f.js +2 -2
- package/text/utf8/test.f.js +2 -2
- package/types/array/test.f.js +2 -2
- package/types/bigint/module.f.d.ts +6 -3
- package/types/bigint/module.f.js +12 -11
- package/types/bigint/test.f.d.ts +2 -0
- package/types/bigint/test.f.js +21 -2
- package/types/bit_vec/module.f.d.ts +66 -34
- package/types/bit_vec/module.f.js +97 -32
- package/types/bit_vec/test.f.d.ts +7 -0
- package/types/bit_vec/test.f.js +283 -62
- package/types/btree/find/test.f.js +9 -8
- package/types/btree/remove/test.f.js +4 -4
- package/types/btree/set/test.f.js +4 -4
- package/types/btree/test.f.js +7 -7
- package/types/byte_set/test.f.js +2 -2
- package/types/function/compare/module.f.d.ts +15 -1
- package/types/function/compare/module.f.js +1 -1
- package/types/function/compare/test.f.js +37 -4
- package/types/list/test.f.js +93 -93
- package/types/monoid/module.f.d.ts +4 -4
- package/types/monoid/module.f.js +3 -3
- package/types/monoid/test.f.js +3 -3
- package/types/nominal/module.f.d.ts +5 -0
- package/types/nominal/module.f.js +4 -0
- package/types/nominal/test.f.d.ts +5 -0
- package/types/nominal/test.f.js +53 -0
- package/types/number/module.f.js +2 -2
- package/{crypto → types}/prime_field/module.f.d.ts +2 -2
- package/{crypto → types}/prime_field/module.f.js +5 -4
- package/{crypto → types}/prime_field/test.f.js +13 -13
- package/types/range_map/test.f.js +21 -21
- package/types/sorted_list/test.f.js +10 -10
- package/types/sorted_set/test.f.js +14 -14
- package/types/string/module.f.js +2 -2
- package/types/string_set/module.f.js +3 -3
- package/bnf/func/module.f.d.ts +0 -148
- package/bnf/func/module.f.js +0 -132
- package/bnf/func/test.f.d.ts +0 -12
- package/bnf/func/test.f.js +0 -171
- package/bnf/func/testlib.f.d.ts +0 -25
- package/bnf/func/testlib.f.js +0 -150
- /package/{issues/31-json.f.d.ts → ci/module.d.ts} +0 -0
- /package/issues/{31-json.f.js → 031-json.f.js} +0 -0
- /package/{crypto → types}/prime_field/test.f.d.ts +0 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Fold, Reduce as OpReduce } from "../function/operator/module.f.ts";
|
|
2
|
+
import { type List, type Thunk } from "../list/module.f.ts";
|
|
3
|
+
import { type Nominal } from "../nominal/module.f.ts";
|
|
2
4
|
/**
|
|
3
|
-
* A vector of bits represented as a `bigint`.
|
|
5
|
+
* A vector of bits represented as a signed `bigint`.
|
|
4
6
|
*/
|
|
5
|
-
export type Vec = bigint
|
|
7
|
+
export type Vec = Nominal<'bit_vec', '1a23a4336197e6158b6936cad34e90d146cd84b9b40ff7ab75a17c6d79e31d89', bigint>;
|
|
6
8
|
/**
|
|
7
9
|
* An empty vector of bits.
|
|
8
10
|
*/
|
|
@@ -10,34 +12,50 @@ export declare const empty: Vec;
|
|
|
10
12
|
/**
|
|
11
13
|
* Calculates the length of the given vector of bits.
|
|
12
14
|
*/
|
|
13
|
-
export declare const length: (v:
|
|
15
|
+
export declare const length: (v: Vec) => bigint;
|
|
14
16
|
/**
|
|
15
|
-
* Creates a vector of bits of the given `len` and the
|
|
17
|
+
* Creates a vector of bits of the given `len` and the provided unsigned integer.
|
|
16
18
|
*
|
|
17
19
|
* @example
|
|
18
20
|
*
|
|
19
21
|
* ```js
|
|
20
22
|
* const vec4 = vec(4n)
|
|
21
|
-
* const v0 = vec4(5n) //
|
|
22
|
-
* const v1 = vec4(0x5FEn) //
|
|
23
|
+
* const v0 = vec4(5n) // -0xDn = -0b1101
|
|
24
|
+
* const v1 = vec4(0x5FEn) // 0xEn = 0b1110
|
|
23
25
|
* ```
|
|
24
26
|
*/
|
|
25
27
|
export declare const vec: (len: bigint) => (ui: bigint) => Vec;
|
|
26
28
|
/**
|
|
27
|
-
* Creates an 8
|
|
29
|
+
* Creates an 8-bit vector from an unsigned integer.
|
|
28
30
|
*/
|
|
29
|
-
export declare const vec8: (
|
|
31
|
+
export declare const vec8: (ui: bigint) => Vec;
|
|
30
32
|
/**
|
|
31
|
-
* Returns the unsigned integer of the
|
|
33
|
+
* Returns the unsigned integer representation of the vector by clearing the stop bit.
|
|
32
34
|
*
|
|
33
35
|
* @example
|
|
34
36
|
*
|
|
35
37
|
* ```js
|
|
36
|
-
* const vector = vec(8n)(0x5n) //
|
|
38
|
+
* const vector = vec(8n)(0x5n) // -0x85n
|
|
37
39
|
* const result = uint(vector); // result is 0x5n
|
|
38
40
|
* ```
|
|
39
41
|
*/
|
|
40
42
|
export declare const uint: (v: Vec) => bigint;
|
|
43
|
+
/**
|
|
44
|
+
* Structure describing the unpacked view of a vector.
|
|
45
|
+
*/
|
|
46
|
+
export type Unpacked = {
|
|
47
|
+
readonly length: bigint;
|
|
48
|
+
readonly uint: bigint;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Extracts the logical length and unsigned integer from the vector.
|
|
52
|
+
*/
|
|
53
|
+
export declare const unpack: (v: Vec) => Unpacked;
|
|
54
|
+
/**
|
|
55
|
+
* Packs an unpacked representation back into a vector.
|
|
56
|
+
*/
|
|
57
|
+
export declare const pack: ({ length, uint }: Unpacked) => Vec;
|
|
58
|
+
export type Reduce = OpReduce<Vec>;
|
|
41
59
|
/**
|
|
42
60
|
* Represents operations for handling bit vectors with a specific bit order.
|
|
43
61
|
*
|
|
@@ -53,13 +71,13 @@ export type BitOrder = {
|
|
|
53
71
|
* @example
|
|
54
72
|
*
|
|
55
73
|
* ```js
|
|
56
|
-
* const vector = vec(8n)(0xF5n)
|
|
74
|
+
* const vector = vec(8n)(0xF5n)
|
|
57
75
|
*
|
|
58
|
-
* const resultL0 = lsb.front(4n)(vector) //
|
|
59
|
-
* const resultL1 = lsb.front(16n)(vector) //
|
|
76
|
+
* const resultL0 = lsb.front(4n)(vector) // 5n
|
|
77
|
+
* const resultL1 = lsb.front(16n)(vector) // 0xF5n
|
|
60
78
|
*
|
|
61
|
-
* const resultM0 = msb.front(4n)(vector) //
|
|
62
|
-
* const resultM1 = msb.front(16n)(vector) //
|
|
79
|
+
* const resultM0 = msb.front(4n)(vector) // 0xFn
|
|
80
|
+
* const resultM1 = msb.front(16n)(vector) // 0xF500n
|
|
63
81
|
* ```
|
|
64
82
|
*/
|
|
65
83
|
readonly front: (len: bigint) => (v: Vec) => bigint;
|
|
@@ -72,13 +90,13 @@ export type BitOrder = {
|
|
|
72
90
|
* @example
|
|
73
91
|
*
|
|
74
92
|
* ```js
|
|
75
|
-
* const v = vec(16n)(0x3456n)
|
|
93
|
+
* const v = vec(16n)(0x3456n)
|
|
76
94
|
*
|
|
77
|
-
* const rL0 = lsb.removeFront(4n)(v) //
|
|
78
|
-
* const rL1 = lsb.removeFront(24n)(v) //
|
|
95
|
+
* const rL0 = lsb.removeFront(4n)(v) // uint(rL0) is 0x345n
|
|
96
|
+
* const rL1 = lsb.removeFront(24n)(v) // rL1 === empty
|
|
79
97
|
*
|
|
80
|
-
* const rM0 = msb.removeFront(4n)(v) //
|
|
81
|
-
* const rM1 = msb.removeFront(24n)(v) //
|
|
98
|
+
* const rM0 = msb.removeFront(4n)(v) // uint(rM0) is 0x456n
|
|
99
|
+
* const rM1 = msb.removeFront(24n)(v) // rM1 === empty
|
|
82
100
|
* ```
|
|
83
101
|
*/
|
|
84
102
|
readonly removeFront: (len: bigint) => (v: Vec) => Vec;
|
|
@@ -90,35 +108,42 @@ export type BitOrder = {
|
|
|
90
108
|
* @returns A function that takes a vector and returns
|
|
91
109
|
* a tuple containing the removed bits as an unsigned integer and the remaining vector.
|
|
92
110
|
*
|
|
111
|
+
* @example
|
|
112
|
+
*
|
|
93
113
|
* ```js
|
|
94
|
-
* const vector = vec(8n)(0xF5n)
|
|
114
|
+
* const vector = vec(8n)(0xF5n)
|
|
95
115
|
*
|
|
96
|
-
* const [uL0, rL0] = lsb.popFront(4n)(vector) // [5n,
|
|
97
|
-
* const [uL1, rL1] = lsb.popFront(16n)(vector) // [0xF5n,
|
|
116
|
+
* const [uL0, rL0] = lsb.popFront(4n)(vector) // [5n, uint(rL0) is 0xFn]
|
|
117
|
+
* const [uL1, rL1] = lsb.popFront(16n)(vector) // [0xF5n, rL1 === empty]
|
|
98
118
|
*
|
|
99
|
-
* const [uM0, rM0] = msb.popFront(4n)(vector) // [0xFn,
|
|
100
|
-
* const [uM1, rM1] = msb.popFront(16n)(vector) // [0xF500n,
|
|
119
|
+
* const [uM0, rM0] = msb.popFront(4n)(vector) // [0xFn, uint(rM0) is 0x5n]
|
|
120
|
+
* const [uM1, rM1] = msb.popFront(16n)(vector) // [0xF500n, rM1 === empty]
|
|
101
121
|
* ```
|
|
102
122
|
*/
|
|
103
123
|
readonly popFront: (len: bigint) => (v: Vec) => readonly [bigint, Vec];
|
|
104
124
|
/**
|
|
105
125
|
* Concatenates two vectors.
|
|
106
126
|
*
|
|
107
|
-
* @param a - The first vector.
|
|
108
127
|
* @returns A function that takes a second vector and returns the concatenated vector.
|
|
109
128
|
*
|
|
110
129
|
* @example
|
|
111
130
|
*
|
|
112
131
|
* ```js
|
|
113
132
|
* const u8 = vec(8n)
|
|
114
|
-
* const a = u8(0x45n)
|
|
115
|
-
* const b = u8(0x89n)
|
|
133
|
+
* const a = u8(0x45n)
|
|
134
|
+
* const b = u8(0x89n)
|
|
116
135
|
*
|
|
117
|
-
* const abL = lsb.concat(a)(b) //
|
|
118
|
-
* const abM = msb.concat(a)(b) //
|
|
136
|
+
* const abL = lsb.concat(a)(b) // uint(abL) is 0x8945n
|
|
137
|
+
* const abM = msb.concat(a)(b) // uint(abM) is 0x4589n
|
|
119
138
|
* ```
|
|
120
139
|
*/
|
|
121
|
-
readonly concat:
|
|
140
|
+
readonly concat: Reduce;
|
|
141
|
+
/**
|
|
142
|
+
* Computes the bitwise exclusive OR of two vectors after normalizing their lengths.
|
|
143
|
+
*
|
|
144
|
+
* @returns A function that takes a second vector and returns the XOR result.
|
|
145
|
+
*/
|
|
146
|
+
readonly xor: Reduce;
|
|
122
147
|
};
|
|
123
148
|
/**
|
|
124
149
|
* Implements operations for handling vectors in a least-significant-bit (LSb) first order.
|
|
@@ -137,7 +162,7 @@ export declare const lsb: BitOrder;
|
|
|
137
162
|
*/
|
|
138
163
|
export declare const msb: BitOrder;
|
|
139
164
|
/**
|
|
140
|
-
* Converts a list of unsigned 8-bit integers to a bit vector.
|
|
165
|
+
* Converts a list of unsigned 8-bit integers to a bit vector using the provided bit order.
|
|
141
166
|
*
|
|
142
167
|
* @param bo The bit order for the conversion
|
|
143
168
|
* @param list The list of unsigned 8-bit integers to be converted.
|
|
@@ -152,4 +177,11 @@ export declare const u8ListToVec: (bo: BitOrder) => (list: List<number>) => Vec;
|
|
|
152
177
|
* @returns A thunk that produces a list of unsigned 8-bit integers.
|
|
153
178
|
*/
|
|
154
179
|
export declare const u8List: ({ popFront }: BitOrder) => (v: Vec) => Thunk<number>;
|
|
155
|
-
|
|
180
|
+
/**
|
|
181
|
+
* Concatenates a list of vectors using the provided bit order.
|
|
182
|
+
*/
|
|
183
|
+
export declare const listToVec: ({ concat }: BitOrder) => (list: List<Vec>) => Vec;
|
|
184
|
+
/**
|
|
185
|
+
* Repeats a vector to create a padded block of the desired length.
|
|
186
|
+
*/
|
|
187
|
+
export declare const repeat: Fold<bigint, Vec>;
|
|
@@ -1,61 +1,113 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Bit vectors that normalize the most-significant bit using signed `bigint` values.
|
|
3
|
+
*
|
|
4
|
+
* A value whose top bit is already set remains positive, while other values are
|
|
5
|
+
* negated after toggling the leading bit so the stop bit is always `1`. The sign bit
|
|
6
|
+
* therefore acts as the stop bit that encodes the logical length of the vector.
|
|
7
|
+
*
|
|
2
8
|
* MSb is most-significant bit first.
|
|
9
|
+
*
|
|
3
10
|
* ```
|
|
4
11
|
* - byte: 0x53 = 0b0101_0011
|
|
5
12
|
* - 0123_4567
|
|
6
13
|
* ```
|
|
14
|
+
*
|
|
7
15
|
* LSb is least-significant bit first.
|
|
16
|
+
*
|
|
8
17
|
* ```
|
|
9
18
|
* - byte: 0x53 = 0b0101_0011
|
|
10
19
|
* - 7654_3210
|
|
11
20
|
* ```
|
|
21
|
+
*
|
|
12
22
|
* @module
|
|
13
23
|
*/
|
|
14
|
-
import {
|
|
24
|
+
import { abs, bitLength, mask, max, xor } from "../bigint/module.f.js";
|
|
15
25
|
import { flip } from "../function/module.f.js";
|
|
16
26
|
import { fold } from "../list/module.f.js";
|
|
27
|
+
import { asBase, asNominal } from "../nominal/module.f.js";
|
|
28
|
+
import { repeat as mRepeat } from "../monoid/module.f.js";
|
|
17
29
|
/**
|
|
18
30
|
* An empty vector of bits.
|
|
19
31
|
*/
|
|
20
|
-
export const empty =
|
|
32
|
+
export const empty = asNominal(0n);
|
|
21
33
|
/**
|
|
22
34
|
* Calculates the length of the given vector of bits.
|
|
23
35
|
*/
|
|
24
|
-
export const length =
|
|
36
|
+
export const length = (v) => bitLength(asBase(v));
|
|
37
|
+
const lazyEmpty = () => empty;
|
|
25
38
|
/**
|
|
26
|
-
* Creates a vector of bits of the given `len` and the
|
|
39
|
+
* Creates a vector of bits of the given `len` and the provided unsigned integer.
|
|
27
40
|
*
|
|
28
41
|
* @example
|
|
29
42
|
*
|
|
30
43
|
* ```js
|
|
31
44
|
* const vec4 = vec(4n)
|
|
32
|
-
* const v0 = vec4(5n) //
|
|
33
|
-
* const v1 = vec4(0x5FEn) //
|
|
45
|
+
* const v0 = vec4(5n) // -0xDn = -0b1101
|
|
46
|
+
* const v1 = vec4(0x5FEn) // 0xEn = 0b1110
|
|
34
47
|
* ```
|
|
35
48
|
*/
|
|
36
49
|
export const vec = (len) => {
|
|
37
50
|
if (len <= 0n) {
|
|
38
|
-
return
|
|
51
|
+
return lazyEmpty;
|
|
39
52
|
}
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
|
|
53
|
+
const m = mask(len);
|
|
54
|
+
const last = len - 1n;
|
|
55
|
+
const lastBit = 1n << last;
|
|
56
|
+
return ui => {
|
|
57
|
+
// normalize `u`
|
|
58
|
+
const u = m & abs(ui);
|
|
59
|
+
//
|
|
60
|
+
const sign = u >> last;
|
|
61
|
+
const x = sign !== 0n ? u : -(u ^ lastBit);
|
|
62
|
+
return asNominal(x);
|
|
63
|
+
};
|
|
43
64
|
};
|
|
44
65
|
/**
|
|
45
|
-
* Creates an 8
|
|
66
|
+
* Creates an 8-bit vector from an unsigned integer.
|
|
46
67
|
*/
|
|
47
68
|
export const vec8 = vec(8n);
|
|
48
69
|
/**
|
|
49
|
-
* Returns the unsigned integer of the
|
|
70
|
+
* Returns the unsigned integer representation of the vector by clearing the stop bit.
|
|
50
71
|
*
|
|
51
72
|
* @example
|
|
52
73
|
*
|
|
53
74
|
* ```js
|
|
54
|
-
* const vector = vec(8n)(0x5n) //
|
|
75
|
+
* const vector = vec(8n)(0x5n) // -0x85n
|
|
55
76
|
* const result = uint(vector); // result is 0x5n
|
|
56
77
|
* ```
|
|
57
78
|
*/
|
|
58
|
-
export const uint = (v) =>
|
|
79
|
+
export const uint = (v) => {
|
|
80
|
+
const b = asBase(v);
|
|
81
|
+
if (b >= 0n) {
|
|
82
|
+
return b;
|
|
83
|
+
}
|
|
84
|
+
const u = -b;
|
|
85
|
+
const len = bitLength(u);
|
|
86
|
+
return u ^ (1n << (len - 1n));
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Extracts the logical length and unsigned integer from the vector.
|
|
90
|
+
*/
|
|
91
|
+
export const unpack = (v) => ({
|
|
92
|
+
length: length(v),
|
|
93
|
+
uint: uint(v),
|
|
94
|
+
});
|
|
95
|
+
/**
|
|
96
|
+
* Packs an unpacked representation back into a vector.
|
|
97
|
+
*/
|
|
98
|
+
export const pack = ({ length, uint }) => vec(length)(uint);
|
|
99
|
+
const lsbNorm = ({ length: al, uint: a }) => ({ length: bl, uint: b }) => (len) => ({ a, b });
|
|
100
|
+
const msbNorm = ({ length: al, uint: a }) => ({ length: bl, uint: b }) => (len) => ({ a: a << (len - al), b: b << (len - bl) });
|
|
101
|
+
/**
|
|
102
|
+
* Normalizes two vectors to the same length before applying a bigint reducer.
|
|
103
|
+
*/
|
|
104
|
+
const op = (norm) => (op) => ap => bp => {
|
|
105
|
+
const au = unpack(ap);
|
|
106
|
+
const bu = unpack(bp);
|
|
107
|
+
const len = max(au.length)(bu.length);
|
|
108
|
+
const { a, b } = norm(au)(bu)(len);
|
|
109
|
+
return vec(len)(op(a)(b));
|
|
110
|
+
};
|
|
59
111
|
/**
|
|
60
112
|
* Implements operations for handling vectors in a least-significant-bit (LSb) first order.
|
|
61
113
|
*
|
|
@@ -66,27 +118,25 @@ export const uint = (v) => v ^ (1n << length(v));
|
|
|
66
118
|
export const lsb = {
|
|
67
119
|
front: len => {
|
|
68
120
|
const m = mask(len);
|
|
69
|
-
return v =>
|
|
70
|
-
const result = v & m;
|
|
71
|
-
return result === v ? uint(v) : result;
|
|
72
|
-
};
|
|
121
|
+
return v => uint(v) & m;
|
|
73
122
|
},
|
|
74
123
|
removeFront: len => v => {
|
|
75
|
-
const
|
|
76
|
-
return
|
|
124
|
+
const { length, uint } = unpack(v);
|
|
125
|
+
return vec(length - len)(uint >> len);
|
|
77
126
|
},
|
|
78
127
|
popFront: len => {
|
|
79
128
|
const m = mask(len);
|
|
80
129
|
return v => {
|
|
81
|
-
const
|
|
82
|
-
return
|
|
130
|
+
const { length, uint } = unpack(v);
|
|
131
|
+
return [uint & m, vec(length - len)(uint >> len)];
|
|
83
132
|
};
|
|
84
133
|
},
|
|
85
|
-
concat: a => {
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
-
return
|
|
134
|
+
concat: (a) => (b) => {
|
|
135
|
+
const { length: al, uint: au } = unpack(a);
|
|
136
|
+
const { length: bl, uint: bu } = unpack(b);
|
|
137
|
+
return vec(al + bl)((bu << al) | au);
|
|
89
138
|
},
|
|
139
|
+
xor: op(lsbNorm)(xor)
|
|
90
140
|
};
|
|
91
141
|
/**
|
|
92
142
|
* Implements operations for handling vectors in a most-significant-bit (MSb) first order.
|
|
@@ -98,21 +148,29 @@ export const lsb = {
|
|
|
98
148
|
export const msb = {
|
|
99
149
|
front: len => {
|
|
100
150
|
const m = mask(len);
|
|
101
|
-
return v =>
|
|
151
|
+
return v => {
|
|
152
|
+
const { length, uint } = unpack(v);
|
|
153
|
+
return (uint >> (length - len)) & m;
|
|
154
|
+
};
|
|
155
|
+
},
|
|
156
|
+
removeFront: len => v => {
|
|
157
|
+
const { length, uint } = unpack(v);
|
|
158
|
+
return vec(length - len)(uint);
|
|
102
159
|
},
|
|
103
|
-
removeFront: len => v => vec(length(v) - len)(v),
|
|
104
160
|
popFront: len => {
|
|
105
161
|
const m = mask(len);
|
|
106
162
|
return v => {
|
|
107
|
-
const
|
|
108
|
-
|
|
163
|
+
const { length, uint } = unpack(v);
|
|
164
|
+
const d = length - len;
|
|
165
|
+
return [(uint >> d) & m, vec(d)(uint)];
|
|
109
166
|
};
|
|
110
167
|
},
|
|
111
168
|
concat: flip(lsb.concat),
|
|
169
|
+
xor: op(msbNorm)(xor)
|
|
112
170
|
};
|
|
113
171
|
const appendU8 = ({ concat }) => (u8) => (a) => concat(a)(vec8(BigInt(u8)));
|
|
114
172
|
/**
|
|
115
|
-
* Converts a list of unsigned 8-bit integers to a bit vector.
|
|
173
|
+
* Converts a list of unsigned 8-bit integers to a bit vector using the provided bit order.
|
|
116
174
|
*
|
|
117
175
|
* @param bo The bit order for the conversion
|
|
118
176
|
* @param list The list of unsigned 8-bit integers to be converted.
|
|
@@ -136,4 +194,11 @@ export const u8List = ({ popFront }) => {
|
|
|
136
194
|
};
|
|
137
195
|
return f;
|
|
138
196
|
};
|
|
139
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Concatenates a list of vectors using the provided bit order.
|
|
199
|
+
*/
|
|
200
|
+
export const listToVec = ({ concat }) => fold(flip(concat))(empty);
|
|
201
|
+
/**
|
|
202
|
+
* Repeats a vector to create a padded block of the desired length.
|
|
203
|
+
*/
|
|
204
|
+
export const repeat = mRepeat({ identity: empty, operation: lsb.concat });
|
|
@@ -30,5 +30,12 @@ declare const _default: {
|
|
|
30
30
|
bitset: () => void;
|
|
31
31
|
appendBack: () => void;
|
|
32
32
|
removeBack: () => void;
|
|
33
|
+
uint: (() => void)[];
|
|
34
|
+
vec: (() => void)[];
|
|
35
|
+
both: () => (() => void)[];
|
|
36
|
+
concat2: () => void;
|
|
37
|
+
lsbXor: () => void;
|
|
38
|
+
msbXor: () => void;
|
|
39
|
+
repeat: () => void;
|
|
33
40
|
};
|
|
34
41
|
export default _default;
|