@nnilky/structo 1.0.0 → 1.0.1

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 (41) hide show
  1. package/package.json +31 -7
  2. package/structo/datatypes/containers/__snapshots__/list.test.ts.snap +0 -25
  3. package/structo/datatypes/containers/__snapshots__/object.test.ts.snap +0 -37
  4. package/structo/datatypes/containers/array.test.ts +0 -28
  5. package/structo/datatypes/containers/array.ts +0 -24
  6. package/structo/datatypes/containers/fastObject.ts +0 -66
  7. package/structo/datatypes/containers/list.test.ts +0 -44
  8. package/structo/datatypes/containers/list.ts +0 -29
  9. package/structo/datatypes/containers/object.test.ts +0 -42
  10. package/structo/datatypes/containers/object.ts +0 -40
  11. package/structo/datatypes/containers/sizedbuffer.test.ts +0 -34
  12. package/structo/datatypes/containers/sizedbuffer.ts +0 -20
  13. package/structo/datatypes/index.ts +0 -18
  14. package/structo/datatypes/lazy.ts +0 -0
  15. package/structo/datatypes/numbers/__snapshots__/bigints.test.ts.snap +0 -261
  16. package/structo/datatypes/numbers/__snapshots__/floats.test.ts.snap +0 -191
  17. package/structo/datatypes/numbers/__snapshots__/sints.test.ts.snap +0 -321
  18. package/structo/datatypes/numbers/__snapshots__/uints.test.ts.snap +0 -321
  19. package/structo/datatypes/numbers/bigints.test.ts +0 -85
  20. package/structo/datatypes/numbers/bigints.ts +0 -48
  21. package/structo/datatypes/numbers/floats.test.ts +0 -91
  22. package/structo/datatypes/numbers/floats.ts +0 -33
  23. package/structo/datatypes/numbers/sints.test.ts +0 -109
  24. package/structo/datatypes/numbers/sints.ts +0 -83
  25. package/structo/datatypes/numbers/uints.test.ts +0 -110
  26. package/structo/datatypes/numbers/uints.ts +0 -82
  27. package/structo/datatypes/transforms/pipe.test.ts +0 -17
  28. package/structo/datatypes/transforms/pipe.ts +0 -88
  29. package/structo/datatypes/transforms/readOffset.ts +0 -20
  30. package/structo/datatypes/transforms/transform.ts +0 -15
  31. package/structo/datatypes/utils.test.ts +0 -39
  32. package/structo/datatypes/values/buffer.test.ts +0 -52
  33. package/structo/datatypes/values/buffer.ts +0 -20
  34. package/structo/datatypes/values/byteliteral.ts +0 -24
  35. package/structo/datatypes/values/string.test.ts +0 -22
  36. package/structo/datatypes/values/string.ts +0 -28
  37. package/structo/index.ts +0 -11
  38. package/structo/read.ts +0 -14
  39. package/structo/types.ts +0 -21
  40. package/structo/utils.test.ts +0 -0
  41. package/structo/write.ts +0 -43
@@ -1,48 +0,0 @@
1
- //@ts-ignore TODO
2
- import type { Serializer } from "../../types";
3
-
4
- const checkValue = (value: number | bigint, start: bigint, end: bigint) => {
5
- if (value < start || value >= end) {
6
- throw new Error("Out of Range");
7
- }
8
- };
9
-
10
- export function u64Bigint(
11
- endian: "little" | "big" = "little",
12
- ): Serializer<number | bigint, bigint> {
13
- return {
14
- size: 8,
15
- write: (ctx, value) => {
16
- checkValue(value, 0n, 2n ** 64n);
17
-
18
- ctx.alloc(8);
19
- ctx.view.setBigUint64(ctx.offset, BigInt(value), endian === "little");
20
- ctx.offset += 8;
21
- },
22
- read: (ctx) => {
23
- const value = ctx.view.getBigUint64(ctx.offset, endian === "little");
24
- ctx.offset += 8;
25
- return value;
26
- },
27
- };
28
- }
29
-
30
- export function s64Bigint(
31
- endian: "little" | "big" = "little",
32
- ): Serializer<number | bigint, bigint> {
33
- return {
34
- size: 8,
35
- write: (ctx, value) => {
36
- checkValue(value, -(2n ** 63n), 2n ** 63n);
37
-
38
- ctx.alloc(8);
39
- ctx.view.setBigInt64(ctx.offset, BigInt(value), endian === "little");
40
- ctx.offset += 8;
41
- },
42
- read: (ctx) => {
43
- const value = ctx.view.getBigInt64(ctx.offset, endian === "little");
44
- ctx.offset += 8;
45
- return value;
46
- },
47
- };
48
- }
@@ -1,91 +0,0 @@
1
- //@ts-ignore TODO
2
- import { describe, it, expect } from "bun:test";
3
- import { expectEncode, expectEncodeSnapshot, expectError, randint } from "../utils.test";
4
-
5
- import * as st from "../../index";
6
-
7
- function test_sint(options: {
8
- name: string;
9
- serializer: st.Serializer<number>;
10
- range: [number, number];
11
- size: number;
12
- }) {
13
- const {
14
- name,
15
- range: [start, end],
16
- serializer,
17
- size,
18
- } = options;
19
-
20
- describe(name, () => {
21
- it(`works in bounds`, () => {
22
- expectEncode(serializer, start);
23
- for (let i = 0; i < 100; i++) {
24
- expectEncode(serializer, randint(start, end));
25
- }
26
- expectEncode(serializer, end);
27
- });
28
-
29
- it(`errors outside bounds`, () => {
30
- expectError(() => st.write(serializer, start - 1));
31
- expectError(() => st.write(serializer, end + 1));
32
- });
33
-
34
- it(`errors on decimal`, () => {
35
- expectError(() => st.write(serializer, 0.1));
36
- });
37
-
38
- it(`is right size`, () => {
39
- const expectValueSize = (value: number) => {
40
- const data = st.write(serializer, value);
41
- expect(data.byteLength).toBe(size);
42
- };
43
- for (let i = 0; i < 100; i++) {
44
- expectValueSize(randint(start, end));
45
- }
46
- expectValueSize(start);
47
- expectValueSize(end);
48
- });
49
-
50
- it(`matches snapshots`, () => {
51
- expectEncodeSnapshot(serializer, 0);
52
- expectEncodeSnapshot(serializer, start);
53
- expectEncodeSnapshot(serializer, start + 10);
54
- expectEncodeSnapshot(serializer, end - 10);
55
- expectEncodeSnapshot(serializer, end);
56
- });
57
- });
58
- }
59
-
60
- test_sint({
61
- name: "st.s8",
62
- serializer: st.s8(),
63
- range: [-128, 127],
64
- size: 1,
65
- });
66
-
67
- test_sint({
68
- name: "st.s16(little)",
69
- serializer: st.s16("little"),
70
- range: [-32_768, 32_767],
71
- size: 2,
72
- });
73
- test_sint({
74
- name: "st.s16(big)",
75
- serializer: st.s16("big"),
76
- range: [-32_768, 32_767],
77
- size: 2,
78
- });
79
-
80
- test_sint({
81
- name: "st.s32(little)",
82
- serializer: st.s32("little"),
83
- range: [-2_147_483_648, 2_147_483_647],
84
- size: 4,
85
- });
86
- test_sint({
87
- name: "st.s32(big)",
88
- serializer: st.s32("big"),
89
- range: [-2_147_483_648, 2_147_483_647],
90
- size: 4,
91
- });
@@ -1,33 +0,0 @@
1
- import type { Serializer } from "../../types";
2
-
3
- export function f32(endian: "little" | "big" = "little"): Serializer<number> {
4
- return {
5
- size: 4,
6
- write: (ctx, value) => {
7
- ctx.alloc(4);
8
- ctx.view.setFloat32(ctx.offset, value, endian === "little");
9
- ctx.offset += 4;
10
- },
11
- read: (ctx) => {
12
- const value = ctx.view.getFloat32(ctx.offset, endian === "little");
13
- ctx.offset += 4;
14
- return value;
15
- },
16
- };
17
- }
18
-
19
- export function f64(endian: "little" | "big" = "little"): Serializer<number> {
20
- return {
21
- size: 8,
22
- write: (ctx, value) => {
23
- ctx.alloc(8);
24
- ctx.view.setFloat64(ctx.offset, value, endian === "little");
25
- ctx.offset += 8;
26
- },
27
- read: (ctx) => {
28
- const value = ctx.view.getFloat64(ctx.offset, endian === "little");
29
- ctx.offset += 8;
30
- return value;
31
- },
32
- };
33
- }
@@ -1,109 +0,0 @@
1
- //@ts-ignore TODO
2
- import { describe, it, expect } from "bun:test";
3
- import { expectEncode, expectEncodeSnapshot, expectError, randint } from "../utils.test";
4
-
5
- import * as st from "../../index";
6
-
7
- function test_sint(options: {
8
- name: string;
9
- serializer: st.Serializer<number>;
10
- range: [number, number];
11
- size: number;
12
- disableRangeCheck?: boolean;
13
- }) {
14
- const {
15
- name,
16
- range: [start, end],
17
- serializer,
18
- size,
19
- disableRangeCheck,
20
- } = options;
21
-
22
- describe(name, () => {
23
- it(`works in bounds`, () => {
24
- expectEncode(serializer, start);
25
- for (let i = 0; i < 100; i++) {
26
- expectEncode(serializer, randint(start, end));
27
- }
28
- expectEncode(serializer, end);
29
- });
30
-
31
- if (!disableRangeCheck) {
32
- it(`errors outside bounds`, () => {
33
- expectError(() => st.write(serializer, start - 1));
34
- expectError(() => st.write(serializer, end + 1));
35
- });
36
- }
37
-
38
- it(`errors on decimal`, () => {
39
- expectError(() => st.write(serializer, 0.1));
40
- });
41
-
42
- it(`is right size`, () => {
43
- const expectValueSize = (value: number) => {
44
- const data = st.write(serializer, value);
45
- expect(data.byteLength).toBe(size);
46
- };
47
- for (let i = 0; i < 100; i++) {
48
- expectValueSize(randint(start, end));
49
- }
50
- expectValueSize(start);
51
- expectValueSize(end);
52
- });
53
-
54
- it(`matches snapshots`, () => {
55
- expectEncodeSnapshot(serializer, 0);
56
- expectEncodeSnapshot(serializer, start);
57
- expectEncodeSnapshot(serializer, start + 10);
58
- expectEncodeSnapshot(serializer, end - 10);
59
- expectEncodeSnapshot(serializer, end);
60
- });
61
- });
62
- }
63
-
64
- test_sint({
65
- name: "st.s8",
66
- serializer: st.s8(),
67
- range: [-128, 127],
68
- size: 1,
69
- });
70
-
71
- test_sint({
72
- name: "st.s16(little)",
73
- serializer: st.s16("little"),
74
- range: [-32_768, 32_767],
75
- size: 2,
76
- });
77
- test_sint({
78
- name: "st.s16(big)",
79
- serializer: st.s16("big"),
80
- range: [-32_768, 32_767],
81
- size: 2,
82
- });
83
-
84
- test_sint({
85
- name: "st.s32(little)",
86
- serializer: st.s32("little"),
87
- range: [-2_147_483_648, 2_147_483_647],
88
- size: 4,
89
- });
90
- test_sint({
91
- name: "st.s32(big)",
92
- serializer: st.s32("big"),
93
- range: [-2_147_483_648, 2_147_483_647],
94
- size: 4,
95
- });
96
- test_sint({
97
- name: "st.s64(little)",
98
- serializer: st.s64("little"),
99
- range: [-(2 ** 62), 2 ** 62],
100
- size: 8,
101
- disableRangeCheck: true,
102
- });
103
- test_sint({
104
- name: "st.s64(big)",
105
- serializer: st.s64("big"),
106
- range: [-(2 ** 62), 2 ** 62],
107
- size: 8,
108
- disableRangeCheck: true,
109
- });
@@ -1,83 +0,0 @@
1
- import type { Serializer } from "../../types";
2
-
3
- const checkValue = (value: number, start: number, end: number) => {
4
- if (!Number.isInteger(value)) {
5
- throw new Error("Not Integer");
6
- }
7
-
8
- if (value < start || value >= end) {
9
- throw new Error("Out of Range");
10
- }
11
- };
12
-
13
- export function s8(): Serializer<number> {
14
- return {
15
- size: 1,
16
- write: (ctx, value) => {
17
- checkValue(value, -(2 ** 7), 2 ** 7);
18
-
19
- ctx.alloc(1);
20
- ctx.view.setInt8(ctx.offset, value);
21
- ctx.offset += 1;
22
- },
23
- read: (ctx) => {
24
- const value = ctx.view.getInt8(ctx.offset);
25
- ctx.offset += 1;
26
- return value;
27
- },
28
- };
29
- }
30
-
31
- export function s16(endian: "little" | "big" = "little"): Serializer<number> {
32
- return {
33
- size: 2,
34
- write: (ctx, value) => {
35
- checkValue(value, -(2 ** 15), 2 ** 15);
36
-
37
- ctx.alloc(2);
38
- ctx.view.setInt16(ctx.offset, value, endian === "little");
39
- ctx.offset += 2;
40
- },
41
- read: (ctx) => {
42
- const value = ctx.view.getInt16(ctx.offset, endian === "little");
43
- ctx.offset += 2;
44
- return value;
45
- },
46
- };
47
- }
48
-
49
- export function s32(endian: "little" | "big" = "little"): Serializer<number> {
50
- return {
51
- size: 4,
52
- write: (ctx, value) => {
53
- checkValue(value, -(2 ** 31), 2 ** 31);
54
-
55
- ctx.alloc(4);
56
- ctx.view.setInt32(ctx.offset, value, endian === "little");
57
- ctx.offset += 4;
58
- },
59
- read: (ctx) => {
60
- const value = ctx.view.getInt32(ctx.offset, endian === "little");
61
- ctx.offset += 4;
62
- return value;
63
- },
64
- };
65
- }
66
-
67
- export function s64(endian: "little" | "big" = "little"): Serializer<number> {
68
- return {
69
- size: 8,
70
- write: (ctx, value) => {
71
- checkValue(value, -(2 ** 63), 2 ** 63);
72
-
73
- ctx.alloc(8);
74
- ctx.view.setBigInt64(ctx.offset, BigInt(value), endian === "little");
75
- ctx.offset += 8;
76
- },
77
- read: (ctx) => {
78
- const value = Number(ctx.view.getBigInt64(ctx.offset, endian === "little"));
79
- ctx.offset += 8;
80
- return value;
81
- },
82
- };
83
- }
@@ -1,110 +0,0 @@
1
- //@ts-ignore TODO
2
- import { describe, it, expect } from "bun:test";
3
- import { expectEncode, expectEncodeSnapshot, expectError, randint } from "../utils.test";
4
-
5
- import * as st from "../../index";
6
-
7
- function test_uint(options: {
8
- name: string;
9
- serializer: st.Serializer<number>;
10
- range: [number, number];
11
- size: number;
12
- disableMaxCheck?: boolean;
13
- }) {
14
- const {
15
- name,
16
- range: [start, end],
17
- serializer,
18
- size,
19
- disableMaxCheck,
20
- } = options;
21
-
22
- describe(name, () => {
23
- it(`works in bounds`, () => {
24
- expectEncode(serializer, start);
25
- for (let i = 0; i < 100; i++) {
26
- expectEncode(serializer, randint(start, end));
27
- }
28
- expectEncode(serializer, end);
29
- });
30
-
31
- it(`errors outside bounds`, () => {
32
- expectError(() => st.write(serializer, start - 1));
33
- if (!disableMaxCheck) {
34
- expectError(() => st.write(serializer, end + 1));
35
- }
36
- });
37
-
38
- it(`errors on decimal`, () => {
39
- expectError(() => st.write(serializer, 0.1));
40
- });
41
-
42
- it(`is right size`, () => {
43
- const expectValueSize = (value: number) => {
44
- const data = st.write(serializer, value);
45
- expect(data.byteLength).toBe(size);
46
- };
47
- for (let i = 0; i < 100; i++) {
48
- expectValueSize(randint(start, end));
49
- }
50
- expectValueSize(start);
51
- expectValueSize(end);
52
- });
53
-
54
- it(`matches snapshots`, () => {
55
- expectEncodeSnapshot(serializer, 0);
56
- expectEncodeSnapshot(serializer, start);
57
- expectEncodeSnapshot(serializer, start + 10);
58
- expectEncodeSnapshot(serializer, end - 10);
59
- expectEncodeSnapshot(serializer, end);
60
- });
61
- });
62
- }
63
-
64
- test_uint({
65
- name: "st.u8",
66
- serializer: st.u8(),
67
- range: [0, 255],
68
- size: 1,
69
- });
70
-
71
- test_uint({
72
- name: "st.u16(little)",
73
- serializer: st.u16("little"),
74
- range: [0, 65_535],
75
- size: 2,
76
- });
77
- test_uint({
78
- name: "st.u16(big)",
79
- serializer: st.u16("big"),
80
- range: [0, 65_535],
81
- size: 2,
82
- });
83
-
84
- test_uint({
85
- name: "st.u32(little)",
86
- serializer: st.u32("little"),
87
- range: [0, 4_294_967_295],
88
- size: 4,
89
- });
90
- test_uint({
91
- name: "st.u32(big)",
92
- serializer: st.u32("big"),
93
- range: [0, 4_294_967_295],
94
- size: 4,
95
- });
96
-
97
- test_uint({
98
- name: "st.u64(little)",
99
- serializer: st.u64("little"),
100
- range: [0, 2 ** 63],
101
- size: 8,
102
- disableMaxCheck: true,
103
- });
104
- test_uint({
105
- name: "st.u64(big)",
106
- serializer: st.u64("big"),
107
- range: [0, 2 ** 63],
108
- size: 8,
109
- disableMaxCheck: true,
110
- });
@@ -1,82 +0,0 @@
1
- import type { Serializer } from "../../types";
2
-
3
- const checkValue = (value: number, start: number, end: number) => {
4
- if (!Number.isInteger(value)) throw new Error("Not Integer");
5
- if (value < start || value >= end) throw new Error("Out of Range");
6
- };
7
-
8
- export function u8(): Serializer<number> {
9
- return {
10
- size: 1,
11
- write: (ctx, value) => {
12
- if (!Number.isInteger(value)) throw new Error("Not Integer");
13
- if (value < 0 || value >= 2 ** 8) throw new Error("Out of Range");
14
-
15
- ctx.alloc(1);
16
- ctx.view.setUint8(ctx.offset, value);
17
- ctx.offset += 1;
18
- },
19
- read: (ctx) => {
20
- const value = ctx.view.getUint8(ctx.offset);
21
- ctx.offset += 1;
22
- return value;
23
- },
24
- };
25
- }
26
-
27
- export function u16(endian: "little" | "big" = "little"): Serializer<number> {
28
- return {
29
- size: 2,
30
- write: (ctx, value) => {
31
- if (!Number.isInteger(value)) throw new Error("Not Integer");
32
- if (value < 0 || value >= 2 ** 16) throw new Error("Out of Range");
33
-
34
- ctx.alloc(2);
35
- ctx.view.setUint16(ctx.offset, value, endian === "little");
36
- ctx.offset += 2;
37
- },
38
- read: (ctx) => {
39
- const value = ctx.view.getUint16(ctx.offset, endian === "little");
40
- ctx.offset += 2;
41
- return value;
42
- },
43
- };
44
- }
45
-
46
- export function u32(endian: "little" | "big" = "little"): Serializer<number> {
47
- return {
48
- size: 4,
49
- write: (ctx, value) => {
50
- if (!Number.isInteger(value)) throw new Error("Not Integer");
51
- if (value < 0 || value >= 2 ** 32) throw new Error("Out of Range");
52
-
53
- ctx.alloc(4);
54
- ctx.view.setUint32(ctx.offset, value, endian === "little");
55
- ctx.offset += 4;
56
- },
57
- read: (ctx) => {
58
- const value = ctx.view.getUint32(ctx.offset, endian === "little");
59
- ctx.offset += 4;
60
- return value;
61
- },
62
- };
63
- }
64
-
65
- export function u64(endian: "little" | "big" = "little"): Serializer<number> {
66
- return {
67
- size: 8,
68
- write: (ctx, value) => {
69
- if (!Number.isInteger(value)) throw new Error("Not Integer");
70
- if (value < 0 || value >= 2 ** 64) throw new Error("Out of Range");
71
-
72
- ctx.alloc(8);
73
- ctx.view.setBigUint64(ctx.offset, BigInt(value), endian === "little");
74
- ctx.offset += 8;
75
- },
76
- read: (ctx) => {
77
- const value = Number(ctx.view.getBigUint64(ctx.offset, endian === "little"));
78
- ctx.offset += 8;
79
- return value;
80
- },
81
- };
82
- }
@@ -1,17 +0,0 @@
1
- //@ts-ignore TODO
2
- import { describe, it, expect } from "bun:test";
3
- import { bytes, expectEncode, expectError, randint } from "../utils.test";
4
-
5
- import * as st from "../../index";
6
-
7
- describe("st.pipe", () => {
8
- it("applies correctly", () => {
9
- const buffer = st.sizedBuffer(st.u8());
10
- expectEncode(buffer, bytes([1, 2]));
11
- });
12
-
13
- it("runs in correct order", () => {
14
- const spec = st.sizedBuffer(st.u8());
15
- expectEncode(spec, bytes([]));
16
- });
17
- });
@@ -1,88 +0,0 @@
1
- import type { Serializer } from "../../types";
2
-
3
- export type Transform<T = any, TNext = T> = (type: Serializer<TNext>) => Serializer<T>;
4
-
5
- export function pipe<TStart, T1>(
6
- type: Serializer<TStart>,
7
- p1: Transform<T1, TStart>,
8
- ): Serializer<T1>;
9
-
10
- export function pipe<TStart, T1, T2>(
11
- type: Serializer<TStart>,
12
- p1: Transform<T1, TStart>,
13
- p2: Transform<T2, T1>,
14
- ): Serializer<T2>;
15
-
16
- export function pipe<TStart, T1, T2, T3>(
17
- type: Serializer<TStart>,
18
- p1: Transform<T1, TStart>,
19
- p2: Transform<T2, T1>,
20
- p3: Transform<T3, T2>,
21
- ): Serializer<T3>;
22
-
23
- export function pipe<TStart, T1, T2, T3, T4>(
24
- type: Serializer<TStart>,
25
- p1: Transform<T1, TStart>,
26
- p2: Transform<T2, T1>,
27
- p3: Transform<T3, T2>,
28
- p4: Transform<T4, T3>,
29
- ): Serializer<T4>;
30
-
31
- export function pipe<TStart, T1, T2, T3, T4, T5>(
32
- type: Serializer<TStart>,
33
- p1: Transform<T1, TStart>,
34
- p2: Transform<T2, T1>,
35
- p3: Transform<T3, T2>,
36
- p4: Transform<T4, T3>,
37
- p5: Transform<T5, T4>,
38
- ): Serializer<T5>;
39
-
40
- export function pipe<TStart, T1, T2, T3, T4, T5, T6>(
41
- type: Serializer<TStart>,
42
- p1: Transform<T1, TStart>,
43
- p2: Transform<T2, T1>,
44
- p3: Transform<T3, T2>,
45
- p4: Transform<T4, T3>,
46
- p5: Transform<T5, T6>,
47
- ): Serializer<T6>;
48
-
49
- export function pipe<TStart, T1, T2, T3, T4, T5, T6, T7>(
50
- type: Serializer<TStart>,
51
- p1: Transform<T1, TStart>,
52
- p2: Transform<T2, T1>,
53
- p3: Transform<T3, T2>,
54
- p4: Transform<T4, T3>,
55
- p5: Transform<T5, T6>,
56
- p6: Transform<T6, T7>,
57
- ): Serializer<T7>;
58
-
59
- export function pipe<TStart, T1, T2, T3, T4, T5, T6, T7, T8>(
60
- type: Serializer<TStart>,
61
- p1: Transform<T1, TStart>,
62
- p2: Transform<T2, T1>,
63
- p3: Transform<T3, T2>,
64
- p4: Transform<T4, T3>,
65
- p5: Transform<T5, T6>,
66
- p6: Transform<T6, T7>,
67
- p7: Transform<T7, T8>,
68
- ): Serializer<T8>;
69
-
70
- export function pipe<TStart, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
71
- type: Serializer<TStart>,
72
- p1: Transform<T1, TStart>,
73
- p2: Transform<T2, T1>,
74
- p3: Transform<T3, T2>,
75
- p4: Transform<T4, T3>,
76
- p5: Transform<T5, T6>,
77
- p6: Transform<T6, T7>,
78
- p7: Transform<T7, T8>,
79
- p8: Transform<T8, T9>,
80
- ): Serializer<T9>;
81
-
82
- export function pipe<T, TPipeline extends Transform[]>(
83
- type: Serializer<T>,
84
- ...pipeline: TPipeline[]
85
- ): any {
86
- //@ts-ignore
87
- return pipeline.reduce((v, func) => func(v), type);
88
- }
@@ -1,20 +0,0 @@
1
- import type { Serializer } from "../../types";
2
-
3
- export function positionOffset<T>(delta: number) {
4
- return (type: Serializer<T>): Serializer<T> => ({
5
- size: type.size,
6
- read: (ctx) => {
7
- let start = ctx.offset;
8
- ctx.offset += delta;
9
- const value = type.read(ctx);
10
- ctx.offset = start;
11
- return value;
12
- },
13
- write: (ctx, value) => {
14
- let start = ctx.offset;
15
- ctx.offset += delta;
16
- type.write(ctx, value);
17
- ctx.offset = start;
18
- },
19
- });
20
- }
@@ -1,15 +0,0 @@
1
- import type { Serializer } from "../../types";
2
-
3
- export function transform<T>(callback: (value: T) => T) {
4
- return (type: Serializer<T>): Serializer<T> => ({
5
- size: type.size,
6
- read: (ctx) => {
7
- const value = type.read(ctx);
8
- return callback(value);
9
- },
10
- write: (ctx, value) => {
11
- let outValue = callback(value);
12
- type.write(ctx, outValue);
13
- },
14
- });
15
- }