@helios-lang/effect 0.1.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 (64) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +3 -0
  3. package/dist/Address.js +13 -0
  4. package/dist/Address.js.map +1 -0
  5. package/dist/Bech32.js +153 -0
  6. package/dist/Bech32.js.map +1 -0
  7. package/dist/Cbor.js +1171 -0
  8. package/dist/Cbor.js.map +1 -0
  9. package/dist/Uplc/Cek.js +3 -0
  10. package/dist/Uplc/Cek.js.map +1 -0
  11. package/dist/Uplc/Data.js +171 -0
  12. package/dist/Uplc/Data.js.map +1 -0
  13. package/dist/Uplc/DataSchema.js +118 -0
  14. package/dist/Uplc/DataSchema.js.map +1 -0
  15. package/dist/Uplc/Primitive.js +23 -0
  16. package/dist/Uplc/Primitive.js.map +1 -0
  17. package/dist/Uplc/index.js +4 -0
  18. package/dist/Uplc/index.js.map +1 -0
  19. package/dist/index.js +5 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/internal/Base32.js +201 -0
  22. package/dist/internal/Base32.js.map +1 -0
  23. package/dist/internal/BigEndian.js +56 -0
  24. package/dist/internal/BigEndian.js.map +1 -0
  25. package/dist/internal/Bits.js +300 -0
  26. package/dist/internal/Bits.js.map +1 -0
  27. package/dist/internal/Bytes.js +293 -0
  28. package/dist/internal/Bytes.js.map +1 -0
  29. package/dist/internal/Flat.js +298 -0
  30. package/dist/internal/Flat.js.map +1 -0
  31. package/dist/internal/Float.js +154 -0
  32. package/dist/internal/Float.js.map +1 -0
  33. package/dist/internal/Utf8.js +44 -0
  34. package/dist/internal/Utf8.js.map +1 -0
  35. package/eslint.config.mjs +30 -0
  36. package/package.json +36 -0
  37. package/src/Address.ts +20 -0
  38. package/src/Bech32.test.ts +117 -0
  39. package/src/Bech32.ts +198 -0
  40. package/src/Cbor.test.ts +1610 -0
  41. package/src/Cbor.ts +1704 -0
  42. package/src/Uplc/Cek.ts +92 -0
  43. package/src/Uplc/Data.ts +259 -0
  44. package/src/Uplc/DataSchema.test.ts +207 -0
  45. package/src/Uplc/DataSchema.ts +181 -0
  46. package/src/Uplc/Primitive.ts +56 -0
  47. package/src/Uplc/index.ts +3 -0
  48. package/src/index.ts +4 -0
  49. package/src/internal/Base32.test.ts +219 -0
  50. package/src/internal/Base32.ts +341 -0
  51. package/src/internal/BigEndian.test.ts +79 -0
  52. package/src/internal/BigEndian.ts +67 -0
  53. package/src/internal/Bits.test.ts +300 -0
  54. package/src/internal/Bits.ts +398 -0
  55. package/src/internal/Bytes.test.ts +369 -0
  56. package/src/internal/Bytes.ts +343 -0
  57. package/src/internal/Flat.test.ts +29 -0
  58. package/src/internal/Flat.ts +387 -0
  59. package/src/internal/Float.test.ts +51 -0
  60. package/src/internal/Float.ts +190 -0
  61. package/src/internal/Utf8.test.ts +69 -0
  62. package/src/internal/Utf8.ts +58 -0
  63. package/tsconfig.build.json +14 -0
  64. package/tsconfig.json +38 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Base32.js","sourceRoot":"","sources":["../../src/internal/Base32.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Either } from "effect";
2
+ import { DecodeException } from "./Bytes.js";
3
+ /**
4
+ * Converts a list of big endian uint8 numbers into an unbounded int
5
+ * @param bytes
6
+ * @returns
7
+ * @throws
8
+ * If `bytes` is empty
9
+ * @throws
10
+ * If any input number is out of range [0,256) or not a whole number
11
+ */
12
+ export function decode(bytes) {
13
+ if (bytes.length == 0) {
14
+ return Either.left(DecodeException(bytes, "Empty bytes"));
15
+ }
16
+ let p = 1n;
17
+ let total = 0n;
18
+ for (let i = bytes.length - 1; i >= 0; i--) {
19
+ const b = bytes[i];
20
+ if (b < 0 || b > 255 || b % 1.0 != 0.0) {
21
+ return Either.left(DecodeException(bytes, `Invalide bytes '${b}' at position ${i}`));
22
+ }
23
+ total += BigInt(b) * p;
24
+ p *= 256n;
25
+ }
26
+ return Either.right(total);
27
+ }
28
+ /**
29
+ * Converts an unbounded integer into a list of big endian uint8 numbers.
30
+ * @param x
31
+ * @returns
32
+ * @throws
33
+ * If `x` isn't a whole number
34
+ * @throws
35
+ * If `x` is negative.
36
+ */
37
+ export function encode(x) {
38
+ if (typeof x == "number") {
39
+ return encode(BigInt(x));
40
+ }
41
+ else if (x < 0n) {
42
+ throw new RangeError(`Unexpected negative number: ${x}`);
43
+ }
44
+ else if (x == 0n) {
45
+ return [0];
46
+ }
47
+ else {
48
+ const res = [];
49
+ while (x > 0n) {
50
+ res.unshift(Number(x % 256n));
51
+ x = x / 256n;
52
+ }
53
+ return res;
54
+ }
55
+ }
56
+ //# sourceMappingURL=BigEndian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BigEndian.js","sourceRoot":"","sources":["../../src/internal/BigEndian.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CACpB,KAA4B;IAE5B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAA;IACV,IAAI,KAAK,GAAG,EAAE,CAAA;IAEd,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAElB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YACvC,OAAO,MAAM,CAAC,IAAI,CAChB,eAAe,CAAC,KAAK,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CACjE,CAAA;QACH,CAAC;QAED,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAEtB,CAAC,IAAI,IAAI,CAAA;IACX,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,CAAkB;IACvC,IAAI,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;SAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC,CAAC,CAAA;IACZ,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;YAE7B,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;QACd,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,300 @@
1
+ import { Either } from "effect";
2
+ import * as Bytes from "./Bytes.js";
3
+ /**
4
+ * @param bytes
5
+ * @param truncate defaults to true
6
+ * @returns {BitReader}
7
+ */
8
+ export function makeReader(bytes, truncate = true) {
9
+ return new ReaderImpl(bytes, truncate ?? true);
10
+ }
11
+ class ReaderImpl {
12
+ view;
13
+ /**
14
+ * bit position, not byte position
15
+ */
16
+ pos;
17
+ /**
18
+ * If true then read last bits as low part of number, if false pad with zero bits (only applies when trying to read more bits than there are left )
19
+ */
20
+ truncate;
21
+ /**
22
+ * @param bytes
23
+ * @param truncate determines behavior when reading too many bits
24
+ */
25
+ constructor(bytes, truncate = true) {
26
+ this.view = Bytes.toUint8Array(bytes);
27
+ this.pos = 0;
28
+ this.truncate = truncate;
29
+ }
30
+ isAtEnd() {
31
+ return Math.trunc(this.pos / 8) >= this.view.length;
32
+ }
33
+ /**
34
+ * Moves position to next byte boundary
35
+ * @param force
36
+ * If true then move to next byte boundary if already at byte boundary
37
+ */
38
+ moveToByteBoundary(force = false) {
39
+ if (this.pos % 8 != 0) {
40
+ const n = 8 - (this.pos % 8);
41
+ void this.readBits(n);
42
+ }
43
+ else if (force) {
44
+ this.readBits(8);
45
+ }
46
+ }
47
+ /**
48
+ * Reads a number of bits (<= 8) and returns the result as an unsigned number
49
+ * @param n number of bits to read
50
+ * @returns
51
+ * @throws
52
+ * If at end
53
+ * @throws
54
+ * If n is larger than 8
55
+ */
56
+ readBits(n) {
57
+ if (n > 8) {
58
+ throw new RangeError(`Reading more than 1 byte (trying to read ${n} bits)`);
59
+ }
60
+ let leftShift = 0;
61
+ if (this.pos + n > this.view.length * 8) {
62
+ const newN = this.view.length * 8 - this.pos;
63
+ if (!this.truncate) {
64
+ leftShift = n - newN;
65
+ }
66
+ n = newN;
67
+ }
68
+ if (n == 0) {
69
+ throw new Error("Bits.Reader is at end");
70
+ }
71
+ // it is assumed we don't need to be at the byte boundary
72
+ let res = 0;
73
+ let i0 = this.pos;
74
+ for (let i = this.pos + 1; i <= this.pos + n; i++) {
75
+ if (i % 8 == 0) {
76
+ const nPart = i - i0;
77
+ res += mask(this.view[Math.trunc(i / 8) - 1], i0 % 8, 8) << (n - nPart);
78
+ i0 = i;
79
+ }
80
+ else if (i == this.pos + n) {
81
+ res += mask(this.view[Math.trunc(i / 8)], i0 % 8, i % 8);
82
+ }
83
+ }
84
+ this.pos += n;
85
+ return res << leftShift;
86
+ }
87
+ /**
88
+ * Reads 8 bits
89
+ * @returns
90
+ */
91
+ readByte() {
92
+ return this.readBits(8);
93
+ }
94
+ }
95
+ /**
96
+ * @returns
97
+ * Writer instance
98
+ */
99
+ export function makeWriter() {
100
+ return new WriterImpl();
101
+ }
102
+ class WriterImpl {
103
+ /**
104
+ * Concatenated and padded upon finalization
105
+ */
106
+ parts;
107
+ /**
108
+ * Number of bits written so far
109
+ */
110
+ n;
111
+ constructor() {
112
+ this.parts = [];
113
+ this.n = 0;
114
+ }
115
+ get length() {
116
+ return this.n;
117
+ }
118
+ /**
119
+ * Pads the Bits.Writer to align with the byte boundary and returns the resulting bytes.
120
+ * @param force force padding (will add one byte if already aligned)
121
+ * @returns
122
+ */
123
+ finalize(force = true) {
124
+ this.padToByteBoundary(force);
125
+ const chars = this.parts.join("");
126
+ const bytes = [];
127
+ for (let i = 0; i < chars.length; i += 8) {
128
+ const byteChars = chars.slice(i, i + 8);
129
+ const byte = parseInt(byteChars, 2);
130
+ bytes.push(byte);
131
+ }
132
+ return bytes;
133
+ }
134
+ /**
135
+ * Add padding to the BitWriter in order to align with the byte boundary.
136
+ * @param force
137
+ * If 'force == true' then 8 bits are added if the Writer is already aligned.
138
+ */
139
+ padToByteBoundary(force = false) {
140
+ let nPad = 0;
141
+ if (this.n % 8 != 0) {
142
+ nPad = 8 - (this.n % 8);
143
+ }
144
+ else if (force) {
145
+ nPad = 8;
146
+ }
147
+ if (nPad != 0) {
148
+ const padding = new Array(nPad).fill("0");
149
+ padding[nPad - 1] = "1";
150
+ this.parts.push(padding.join(""));
151
+ this.n += nPad;
152
+ }
153
+ }
154
+ /**
155
+ * Pop n bits of the end
156
+ * @param n
157
+ * @returns
158
+ */
159
+ pop(n) {
160
+ if (n > this.n) {
161
+ throw new Error(`Too many bits to pop, only have ${this.n} bits, but want n=${n}`);
162
+ }
163
+ const n0 = n;
164
+ const parts = [];
165
+ while (n > 0) {
166
+ const last = this.parts.pop();
167
+ if (last !== undefined) {
168
+ if (last.length <= n) {
169
+ parts.unshift(last);
170
+ n -= last.length;
171
+ }
172
+ else {
173
+ parts.unshift(last.slice(last.length - n));
174
+ this.parts.push(last.slice(0, last.length - n));
175
+ n = 0;
176
+ }
177
+ }
178
+ }
179
+ this.n -= n0;
180
+ const bits = parts.join("");
181
+ if (bits.length != n0) {
182
+ throw new Error(`Internal error: expected ${n0} bits popped, but popped ${bits.length}`);
183
+ }
184
+ return bits;
185
+ }
186
+ /**
187
+ * Write a string of '0's and '1's to the BitWriter.
188
+ * Returns the BitWriter to enable chaining
189
+ * @param bitChars
190
+ * @returns
191
+ * Self so these calls can be chain
192
+ */
193
+ writeBits(bitChars) {
194
+ for (const c of bitChars) {
195
+ if (c != "0" && c != "1") {
196
+ throw new Error(`Bit string contains invalid chars: ${bitChars}`);
197
+ }
198
+ }
199
+ this.parts.push(bitChars);
200
+ this.n += bitChars.length;
201
+ return this;
202
+ }
203
+ /**
204
+ * Returns the BitWriter to enable chaining
205
+ * @param byte
206
+ * @returns
207
+ * Self so these calls can be chain
208
+ */
209
+ writeByte(byte) {
210
+ if (byte < 0 || byte > 255) {
211
+ throw new Error(`Invalid byte: ${byte}`);
212
+ }
213
+ this.writeBits(pad(byte.toString(2), 8));
214
+ return this;
215
+ }
216
+ }
217
+ /**
218
+ * Converts a 8 bit integer number into a bit string with an optional "0b" prefix.
219
+ * The result is padded with leading zeroes to become 'n' chars long ('2 + n' chars long if you count the "0b" prefix).
220
+ * @example
221
+ * byteToBits(7) == "0b00000111"
222
+ * @param {number} b
223
+ * @param {number} n
224
+ * @param {boolean} prefix
225
+ * @returns {string}
226
+ */
227
+ export function fromByte(b, n = 8, prefix = true) {
228
+ if (b < 0 || b > 255) {
229
+ return Either.left(new RangeError(`Invalid byte: ${b}`));
230
+ }
231
+ const bits = b.toString(2);
232
+ if (n < bits.length) {
233
+ return Either.left(new RangeError(`n is smaller than the number of bits: ${n} < ${bits.length}`));
234
+ }
235
+ const s = pad(bits, n);
236
+ if (prefix) {
237
+ return Either.right("0b" + s);
238
+ }
239
+ else {
240
+ return Either.right(s);
241
+ }
242
+ }
243
+ /**
244
+ * @param bytes
245
+ * @param i
246
+ * bit index
247
+ * @returns
248
+ * 0 or 1
249
+ */
250
+ export function getBit(bytes, i) {
251
+ return ((bytes[Math.floor(i / 8)] >> (i % 8)) & 1);
252
+ }
253
+ const BIT_MASKS = [
254
+ 0b11111111, 0b01111111, 0b00111111, 0b00011111, 0b00001111, 0b00000111,
255
+ 0b00000011, 0b00000001
256
+ ];
257
+ /**
258
+ * Masks bits of `b` by setting bits outside the range `[i0, i1)` to 0.
259
+ * `b` is an 8 bit integer (i.e. number between 0 and 255).
260
+ * The return value is also an 8 bit integer, shifted right by `i1`.
261
+ * @example
262
+ * maskBits(0b11111111, 1, 4) == 0b0111 // (i.e. 7)
263
+ * @param b
264
+ * @param i0
265
+ * @param i1
266
+ * @returns
267
+ */
268
+ export function mask(b, i0, i1) {
269
+ if (i0 >= i1 || i0 < 0 || i0 > 7 || i1 > 8 || b < 0 || b > 255) {
270
+ throw new RangeError(`Invalid Bits.mask arguments: b=${b}, i0=${i0}, i1=${i1}`);
271
+ }
272
+ return (b & BIT_MASKS[i0]) >> (8 - i1);
273
+ }
274
+ /**
275
+ * Prepends zeroes to a bit-string so that 'result.length == n'.
276
+ * If `n < nCurrent`, pad to next multiple of `n`.
277
+ * @example
278
+ * padBits("1111", 8) == "00001111"
279
+ * @param bits
280
+ * @param n
281
+ * @returns
282
+ * @throws
283
+ * If n is zero or negative
284
+ */
285
+ export function pad(bits, n) {
286
+ const nBits = bits.length;
287
+ if (nBits == n) {
288
+ return bits;
289
+ }
290
+ else if (n <= 0) {
291
+ throw new RangeError(`Expected pad length n to be > 0, got n=${n}`);
292
+ }
293
+ else if (nBits % n != 0) {
294
+ // padded to multiple of n
295
+ const nPad = n - (nBits % n);
296
+ bits = new Array(nPad).fill("0").join("") + bits;
297
+ }
298
+ return bits;
299
+ }
300
+ //# sourceMappingURL=Bits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bits.js","sourceRoot":"","sources":["../../src/internal/Bits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,293 @@
1
+ import { Data, Effect, Encoding } from "effect";
2
+ import { encode as encodeIntBE } from "./BigEndian";
3
+ export class EndOfStreamError extends Data.TaggedError("EndOfStreamError") {
4
+ constructor(stream) {
5
+ super({ message: `Bytes.Stream is at end (pos=${stream.pos})` });
6
+ }
7
+ }
8
+ /**
9
+ * Doesn't throw an error if any input number is outside the range [0,256)
10
+ * @param bytes
11
+ * @returns
12
+ */
13
+ export function toArray(bytes) {
14
+ if (bytes instanceof Uint8Array) {
15
+ return Array.from(bytes);
16
+ }
17
+ else if (typeof bytes == "string") {
18
+ const result = Encoding.decodeHex(bytes);
19
+ if (result._tag == "Left") {
20
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
21
+ throw result.left;
22
+ }
23
+ return Array.from(result.right);
24
+ }
25
+ else if (Array.isArray(bytes)) {
26
+ return bytes;
27
+ }
28
+ else if ("peekRemaining" in bytes) {
29
+ return bytes.peekRemaining();
30
+ }
31
+ else {
32
+ throw new Error("Expected BytesLike");
33
+ }
34
+ }
35
+ export function toHex(bytes) {
36
+ if (bytes instanceof Uint8Array) {
37
+ return Encoding.encodeHex(bytes);
38
+ }
39
+ else if (typeof bytes == "string") {
40
+ return bytes;
41
+ }
42
+ else if (Array.isArray(bytes)) {
43
+ return Encoding.encodeHex(Uint8Array.from(bytes));
44
+ }
45
+ else if ("peekRemaining" in bytes) {
46
+ return Encoding.encodeHex(Uint8Array.from(bytes.peekRemaining()));
47
+ }
48
+ else {
49
+ throw new Error("Expected BytesLike");
50
+ }
51
+ }
52
+ /**
53
+ * Doesn't throw an error if any input number is outside the range [0,256)
54
+ * @param bytes
55
+ * @returns
56
+ */
57
+ export function toUint8Array(bytes) {
58
+ if (bytes instanceof Uint8Array) {
59
+ return bytes;
60
+ }
61
+ else if (typeof bytes == "string") {
62
+ const result = Encoding.decodeHex(bytes);
63
+ if (result._tag == "Left") {
64
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
65
+ throw result.left;
66
+ }
67
+ return result.right;
68
+ }
69
+ else if (Array.isArray(bytes)) {
70
+ return Uint8Array.from(bytes);
71
+ }
72
+ else if ("peekRemaining" in bytes) {
73
+ return bytes.bytes.slice(bytes.pos);
74
+ }
75
+ else {
76
+ throw new Error(`Expected BytesLike`);
77
+ }
78
+ }
79
+ /**
80
+ * @param arg
81
+ * @returns
82
+ */
83
+ export function makeStream(arg) {
84
+ if (arg instanceof StreamImpl) {
85
+ // most common case
86
+ return arg;
87
+ }
88
+ else if (typeof arg == "string" || Array.isArray(arg)) {
89
+ return new StreamImpl(toUint8Array(arg));
90
+ }
91
+ else if ("pos" in arg && "bytes" in arg) {
92
+ return arg;
93
+ }
94
+ else if (arg instanceof Uint8Array) {
95
+ return new StreamImpl(arg);
96
+ }
97
+ return makeStream(arg.bytes);
98
+ }
99
+ class StreamImpl {
100
+ bytes;
101
+ pos;
102
+ /**
103
+ * @param bytes
104
+ * @param pos
105
+ */
106
+ constructor(bytes, pos = 0) {
107
+ this.bytes = bytes;
108
+ this.pos = pos;
109
+ }
110
+ /**
111
+ * Copy ByteStream so mutations doesn't change original ByteStream
112
+ * @returns
113
+ */
114
+ copy() {
115
+ return new StreamImpl(this.bytes, this.pos);
116
+ }
117
+ isAtEnd() {
118
+ return this.pos >= this.bytes.length;
119
+ }
120
+ /**
121
+ * @returns
122
+ * The byte at the current position
123
+ */
124
+ peekOne() {
125
+ if (this.pos < this.bytes.length) {
126
+ return Effect.succeed(this.bytes[this.pos]);
127
+ }
128
+ else {
129
+ return Effect.fail(new EndOfStreamError(this));
130
+ }
131
+ }
132
+ /**
133
+ * @param n
134
+ * @returns
135
+ * @throws
136
+ * If n is negative
137
+ */
138
+ peekMany(n) {
139
+ if (n < 0) {
140
+ throw new RangeError(`Unexpected negative n: ${n}`);
141
+ }
142
+ if (this.pos + n <= this.bytes.length) {
143
+ return Effect.succeed(Array.from(this.bytes.slice(this.pos, this.pos + n)));
144
+ }
145
+ else {
146
+ return Effect.fail(new EndOfStreamError(this));
147
+ }
148
+ }
149
+ peekRemaining() {
150
+ return Array.from(this.bytes.slice(this.pos));
151
+ }
152
+ /**
153
+ * @returns
154
+ * @throws
155
+ * If at end
156
+ */
157
+ shiftOne() {
158
+ if (this.pos < this.bytes.length) {
159
+ const b = this.bytes[this.pos];
160
+ this.pos += 1;
161
+ return Effect.succeed(b);
162
+ }
163
+ else {
164
+ return Effect.fail(new EndOfStreamError(this));
165
+ }
166
+ }
167
+ /**
168
+ * @param n
169
+ * @returns {number[]}
170
+ * @throws
171
+ * If n is negative
172
+ */
173
+ shiftMany(n) {
174
+ if (n < 0) {
175
+ throw new RangeError(`Unexpected negative n: ${n}`);
176
+ }
177
+ if (this.pos + n <= this.bytes.length) {
178
+ const res = Array.from(this.bytes.slice(this.pos, this.pos + n));
179
+ this.pos += n;
180
+ return Effect.succeed(res);
181
+ }
182
+ else {
183
+ return Effect.fail(new EndOfStreamError(this));
184
+ }
185
+ }
186
+ shiftRemaining() {
187
+ const res = Array.from(this.bytes.slice(this.pos));
188
+ this.pos = this.bytes.length;
189
+ return res;
190
+ }
191
+ }
192
+ /**
193
+ * @param a
194
+ * @param b
195
+ * @param shortestFirst defaults to false (strictly lexicographic comparison)
196
+ * @returns
197
+ * -1 if a < b, 0 if a == b, 1 if a > b
198
+ */
199
+ export function compare(a, b, shortestFirst = false) {
200
+ const la = toArray(a);
201
+ const lb = toArray(b);
202
+ const na = la.length;
203
+ const nb = lb.length;
204
+ if (shortestFirst && na != nb) {
205
+ return na < nb ? -1 : 1;
206
+ }
207
+ for (let i = 0; i < Math.min(na, nb); i++) {
208
+ if (la[i] < lb[i]) {
209
+ return -1;
210
+ }
211
+ else if (la[i] > lb[i]) {
212
+ return 1;
213
+ }
214
+ }
215
+ if (na != nb) {
216
+ return na < nb ? -1 : 1;
217
+ }
218
+ else {
219
+ return 0;
220
+ }
221
+ }
222
+ /**
223
+ * Used to create dummy hashes for testing
224
+ * @param n
225
+ * @param seed
226
+ * @returns
227
+ */
228
+ export function dummy(n, seed = 0) {
229
+ return pad(encodeIntBE(seed), n).slice(0, n);
230
+ }
231
+ /**
232
+ * @param a
233
+ * @param b
234
+ * @returns
235
+ */
236
+ export function equals(a, b) {
237
+ return compare(a, b) == 0;
238
+ }
239
+ /**
240
+ * Pad by appending zeroes.
241
+ * If `n < nCurrent`, pad to next multiple of `n`.
242
+ * @param bytes
243
+ * @param n pad length
244
+ * @returns
245
+ * @throws
246
+ * If pad length is zero or negative
247
+ */
248
+ export function pad(bytes, n) {
249
+ const nBytes = bytes.length;
250
+ if (nBytes == n) {
251
+ return bytes;
252
+ }
253
+ else if (n <= 0) {
254
+ throw new Error(`Invalid pad length (must be > 0, got ${n})`);
255
+ }
256
+ else if (nBytes % n != 0 || nBytes == 0) {
257
+ // padded to multiple of n
258
+ const nPad = n - (nBytes % n);
259
+ bytes = bytes.concat(new Array(nPad).fill(0));
260
+ }
261
+ return bytes;
262
+ }
263
+ /**
264
+ * Pad by prepending zeroes.
265
+ * Throws an error
266
+ * @param bytes
267
+ * @param n prepad length
268
+ * @returns
269
+ * @throws
270
+ * If prepad length is zero or negative
271
+ * @throws
272
+ * if bytes.length > n
273
+ */
274
+ export function prepad(bytes, n) {
275
+ const nBytes = bytes.length;
276
+ if (nBytes == n) {
277
+ return bytes;
278
+ }
279
+ else if (n <= 0) {
280
+ throw new Error(`Invalid prepad length (must be > 0, got ${n})`);
281
+ }
282
+ else if (nBytes > n) {
283
+ throw new Error(`Padding goal length smaller than bytes length (${n} < ${nBytes})`);
284
+ }
285
+ else {
286
+ const nPad = n - nBytes;
287
+ return new Array(nPad).fill(0).concat(bytes);
288
+ }
289
+ }
290
+ export function DecodeException(bytes, message) {
291
+ return Encoding.DecodeException(toHex(bytes), message);
292
+ }
293
+ //# sourceMappingURL=Bytes.js.map