Skip to content

Commit 7c6835e

Browse files
refactor(matrices): update to remove dynamic codegen (#497)
BREAKING CHANGE: Refactoring & restructuring related to #497 - replace former codegen approach with higher-order functions - add new`defMath()` & `defMathN()` impls
1 parent 734c202 commit 7c6835e

File tree

13 files changed

+171
-53
lines changed

13 files changed

+171
-53
lines changed

packages/matrices/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,6 @@
108108
"./column": {
109109
"default": "./column.js"
110110
},
111-
"./compile/emit": {
112-
"default": "./compile/emit.js"
113-
},
114111
"./concat": {
115112
"default": "./concat.js"
116113
},
@@ -120,6 +117,9 @@
120117
"./constants": {
121118
"default": "./constants.js"
122119
},
120+
"./defmath": {
121+
"default": "./defmath.js"
122+
},
123123
"./determinant": {
124124
"default": "./determinant.js"
125125
},

packages/matrices/src/add.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
22
import { add as _add, add4 } from "@thi.ng/vectors/add";
3+
import { $add } from "@thi.ng/vectors/ops";
34
import type { MatOpMM, MultiMatOpMM } from "./api.js";
4-
import { defMath } from "./compile/emit.js";
5+
import { defMath } from "./defmath.js";
56

67
/**
78
* Componentwise matrix addition. If `out` is not given, writes result
@@ -15,4 +16,4 @@ import { defMath } from "./compile/emit.js";
1516
*/
1617
export const add: MultiMatOpMM = _add;
1718
export const add22: MatOpMM = add4;
18-
export const [add23, add33, add44] = defMath(add, "+");
19+
export const [add23, add33, add44] = defMath($add);

packages/matrices/src/addn.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
22
import { addN as _addN, addN4 } from "@thi.ng/vectors/addn";
3+
import { $add } from "@thi.ng/vectors/ops";
34
import type { MatOpMN, MultiMatOpMN } from "./api.js";
4-
import { defMathN } from "./compile/emit.js";
5+
import { defMathN } from "./defmath.js";
56

67
/**
78
* Adds single scalar componentwise to matrix. If `out` is not given,
@@ -15,4 +16,4 @@ import { defMathN } from "./compile/emit.js";
1516
*/
1617
export const addN: MultiMatOpMN = _addN;
1718
export const addN22: MatOpMN = addN4;
18-
export const [addN23, addN33, addN44] = defMathN(addN, "+");
19+
export const [addN23, addN33, addN44] = defMathN($add);

packages/matrices/src/compile/emit.ts

-25
This file was deleted.

packages/matrices/src/defmath.ts

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
import type { FnN2 } from "@thi.ng/api";
3+
import type { MatOpMM, MatOpMN } from "./api.js";
4+
5+
/** @internal */
6+
export const defMath = (op: FnN2): [MatOpMM, MatOpMM, MatOpMM] => [
7+
(o, a, b) => {
8+
!o && (o = a);
9+
o[0] = op(a[0], b[0]);
10+
o[1] = op(a[1], b[1]);
11+
o[2] = op(a[2], b[2]);
12+
o[3] = op(a[3], b[3]);
13+
o[4] = op(a[4], b[4]);
14+
o[5] = op(a[5], b[5]);
15+
return o;
16+
},
17+
(o, a, b) => {
18+
!o && (o = a);
19+
o[0] = op(a[0], b[0]);
20+
o[1] = op(a[1], b[1]);
21+
o[2] = op(a[2], b[2]);
22+
o[3] = op(a[3], b[3]);
23+
o[4] = op(a[4], b[4]);
24+
o[5] = op(a[5], b[5]);
25+
o[6] = op(a[6], b[6]);
26+
o[7] = op(a[7], b[7]);
27+
o[8] = op(a[8], b[8]);
28+
return o;
29+
},
30+
(o, a, b) => {
31+
!o && (o = a);
32+
o[0] = op(a[0], b[0]);
33+
o[1] = op(a[1], b[1]);
34+
o[2] = op(a[2], b[2]);
35+
o[3] = op(a[3], b[3]);
36+
o[4] = op(a[4], b[4]);
37+
o[5] = op(a[5], b[5]);
38+
o[6] = op(a[6], b[6]);
39+
o[7] = op(a[7], b[7]);
40+
o[8] = op(a[8], b[8]);
41+
o[9] = op(a[9], b[9]);
42+
o[10] = op(a[10], b[10]);
43+
o[11] = op(a[11], b[11]);
44+
o[12] = op(a[12], b[12]);
45+
o[13] = op(a[13], b[13]);
46+
o[14] = op(a[14], b[14]);
47+
o[15] = op(a[15], b[15]);
48+
return o;
49+
},
50+
];
51+
52+
/** @internal */
53+
export const defMathN = (op: FnN2): [MatOpMN, MatOpMN, MatOpMN] => [
54+
(o, a, n) => {
55+
!o && (o = a);
56+
o[0] = op(a[0], n);
57+
o[1] = op(a[1], n);
58+
o[2] = op(a[2], n);
59+
o[3] = op(a[3], n);
60+
o[4] = op(a[4], n);
61+
o[5] = op(a[5], n);
62+
return o;
63+
},
64+
(o, a, n) => {
65+
!o && (o = a);
66+
o[0] = op(a[0], n);
67+
o[1] = op(a[1], n);
68+
o[2] = op(a[2], n);
69+
o[3] = op(a[3], n);
70+
o[4] = op(a[4], n);
71+
o[5] = op(a[5], n);
72+
o[6] = op(a[6], n);
73+
o[7] = op(a[7], n);
74+
o[8] = op(a[8], n);
75+
return o;
76+
},
77+
(o, a, n) => {
78+
!o && (o = a);
79+
o[0] = op(a[0], n);
80+
o[1] = op(a[1], n);
81+
o[2] = op(a[2], n);
82+
o[3] = op(a[3], n);
83+
o[4] = op(a[4], n);
84+
o[5] = op(a[5], n);
85+
o[6] = op(a[6], n);
86+
o[7] = op(a[7], n);
87+
o[8] = op(a[8], n);
88+
o[9] = op(a[9], n);
89+
o[10] = op(a[10], n);
90+
o[11] = op(a[11], n);
91+
o[12] = op(a[12], n);
92+
o[13] = op(a[13], n);
93+
o[14] = op(a[14], n);
94+
o[15] = op(a[15], n);
95+
return o;
96+
},
97+
];

packages/matrices/src/div.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
22
import { div as _div, div4 } from "@thi.ng/vectors/div";
3+
import { $div } from "@thi.ng/vectors/ops";
34
import type { MatOpMM, MultiMatOpMM } from "./api.js";
4-
import { defMath } from "./compile/emit.js";
5+
import { defMath } from "./defmath.js";
56

67
/**
78
* Componentwise matrix division. If `out` is not given, writes result
@@ -15,4 +16,4 @@ import { defMath } from "./compile/emit.js";
1516
*/
1617
export const div: MultiMatOpMM = _div;
1718
export const div22: MatOpMM = div4;
18-
export const [div23, div33, div44] = defMath(div, "/");
19+
export const [div23, div33, div44] = defMath($div);

packages/matrices/src/divn.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
22
import { divN as _divN, divN4 } from "@thi.ng/vectors/divn";
3+
import { $div } from "@thi.ng/vectors/ops";
34
import type { MatOpMN, MultiMatOpMN } from "./api.js";
4-
import { defMathN } from "./compile/emit.js";
5+
import { defMathN } from "./defmath.js";
56

67
/**
78
* Componentwise matrix division by single scalar. If `out` is not
@@ -15,4 +16,4 @@ import { defMathN } from "./compile/emit.js";
1516
*/
1617
export const divN: MultiMatOpMN = _divN;
1718
export const divN22: MatOpMN = divN4;
18-
export const [divN23, divN33, divN44] = defMathN(divN, "/");
19+
export const [divN23, divN33, divN44] = defMathN($div);

packages/matrices/src/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// SPDX-License-Identifier: Apache-2.0
22
export * from "./api.js";
33
export * from "./constants.js";
4-
export * from "./compile/emit.js";
54

65
export * from "./add.js";
76
export * from "./addn.js";

packages/matrices/src/mul.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
22
import { mul as _mul, mul4 } from "@thi.ng/vectors/mul";
3+
import { $mul } from "@thi.ng/vectors/ops";
34
import type { MatOpMM, MultiMatOpMM } from "./api.js";
4-
import { defMath } from "./compile/emit.js";
5+
import { defMath } from "./defmath.js";
56

67
/**
78
* Componentwise matrix multiplication. Use {@link mulM} or
@@ -17,4 +18,4 @@ import { defMath } from "./compile/emit.js";
1718
*/
1819
export const mul: MultiMatOpMM = _mul;
1920
export const mul22: MatOpMM = mul4;
20-
export const [mul23, mul33, mul44] = defMath(mul, "*");
21+
export const [mul23, mul33, mul44] = defMath($mul);

packages/matrices/src/muln.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
22
import { mulN as _mulN, mulN4 } from "@thi.ng/vectors/muln";
3+
import { $mul } from "@thi.ng/vectors/ops";
34
import type { MatOpMN, MultiMatOpMN } from "./api.js";
4-
import { defMathN } from "./compile/emit.js";
5+
import { defMathN } from "./defmath.js";
56

67
/**
78
* Multiplies matrix componentwise with single scalar. If `out` is not
@@ -15,4 +16,4 @@ import { defMathN } from "./compile/emit.js";
1516
*/
1617
export const mulN: MultiMatOpMN = _mulN;
1718
export const mulN22: MatOpMN = mulN4;
18-
export const [mulN23, mulN33, mulN44] = defMathN(mulN, "*");
19+
export const [mulN23, mulN33, mulN44] = defMathN($mul);

packages/matrices/src/set.ts

+47-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,53 @@
11
// SPDX-License-Identifier: Apache-2.0
2-
import { compile } from "@thi.ng/vectors/compile/emit";
3-
import { SET } from "@thi.ng/vectors/compile/templates";
42
import { set as _set, set4 } from "@thi.ng/vectors/set";
53
import type { MatOpM } from "./api.js";
64

7-
const $ = (dim: number) =>
8-
_set.add(dim, compile(dim, SET, "o,a", undefined, "o"));
9-
105
export const set: MatOpM = _set;
6+
117
export const set22: MatOpM = set4;
12-
export const set23: MatOpM = $(6);
13-
export const set33: MatOpM = $(9);
14-
export const set44: MatOpM = $(16);
8+
9+
export const set23: MatOpM = _set.add(6, (o, a) => {
10+
!o && (o = []);
11+
o[0] = a[0];
12+
o[1] = a[1];
13+
o[2] = a[2];
14+
o[3] = a[3];
15+
o[4] = a[4];
16+
o[5] = a[5];
17+
return o;
18+
});
19+
20+
export const set33: MatOpM = _set.add(9, (o, a) => {
21+
!o && (o = []);
22+
o[0] = a[0];
23+
o[1] = a[1];
24+
o[2] = a[2];
25+
o[3] = a[3];
26+
o[4] = a[4];
27+
o[5] = a[5];
28+
o[6] = a[6];
29+
o[7] = a[7];
30+
o[8] = a[8];
31+
return o;
32+
});
33+
34+
export const set44: MatOpM = _set.add(16, (o, a) => {
35+
!o && (o = []);
36+
o[0] = a[0];
37+
o[1] = a[1];
38+
o[2] = a[2];
39+
o[3] = a[3];
40+
o[4] = a[4];
41+
o[5] = a[5];
42+
o[6] = a[6];
43+
o[7] = a[7];
44+
o[8] = a[8];
45+
o[9] = a[9];
46+
o[10] = a[10];
47+
o[11] = a[11];
48+
o[12] = a[12];
49+
o[13] = a[13];
50+
o[14] = a[14];
51+
o[15] = a[15];
52+
return o;
53+
});

packages/matrices/src/sub.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
2+
import { $sub } from "@thi.ng/vectors/ops";
23
import { sub as _sub, sub4 } from "@thi.ng/vectors/sub";
34
import type { MatOpMM, MultiMatOpMM } from "./api.js";
4-
import { defMath } from "./compile/emit.js";
5+
import { defMath } from "./defmath.js";
56

67
/**
78
* Componentwise matrix subtraction. If `out` is not given, writes
@@ -15,4 +16,4 @@ import { defMath } from "./compile/emit.js";
1516
*/
1617
export const sub: MultiMatOpMM = _sub;
1718
export const sub22: MatOpMM = sub4;
18-
export const [sub23, sub33, sub44] = defMath(sub, "-");
19+
export const [sub23, sub33, sub44] = defMath($sub);

packages/matrices/src/subn.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// SPDX-License-Identifier: Apache-2.0
2+
import { $sub } from "@thi.ng/vectors/ops";
23
import { subN as _subN, subN4 } from "@thi.ng/vectors/subn";
34
import type { MatOpMN, MultiMatOpMN } from "./api.js";
4-
import { defMathN } from "./compile/emit.js";
5+
import { defMathN } from "./defmath.js";
56

67
/**
78
* Componentwise scalar subtraction. If `out` is not given, writes
@@ -15,4 +16,4 @@ import { defMathN } from "./compile/emit.js";
1516
*/
1617
export const subN: MultiMatOpMN = _subN;
1718
export const subN22: MatOpMN = subN4;
18-
export const [subN23, subN33, subN44] = defMathN(subN, "-");
19+
export const [subN23, subN33, subN44] = defMathN($sub);

0 commit comments

Comments
 (0)