@spiky-panda/core 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 (130) hide show
  1. package/dist/geometry/geometry.cartesian.d.ts +56 -0
  2. package/dist/geometry/geometry.cartesian.js +229 -0
  3. package/dist/geometry/geometry.cartesian.js.map +1 -0
  4. package/dist/geometry/geometry.interfaces.d.ts +37 -0
  5. package/dist/geometry/geometry.interfaces.js +31 -0
  6. package/dist/geometry/geometry.interfaces.js.map +1 -0
  7. package/dist/geometry/index.d.ts +2 -0
  8. package/dist/geometry/index.js +3 -0
  9. package/dist/geometry/index.js.map +1 -0
  10. package/dist/graph/graph.builder.graph.d.ts +44 -0
  11. package/dist/graph/graph.builder.graph.js +78 -0
  12. package/dist/graph/graph.builder.graph.js.map +1 -0
  13. package/dist/graph/graph.builder.node.d.ts +20 -0
  14. package/dist/graph/graph.builder.node.js +45 -0
  15. package/dist/graph/graph.builder.node.js.map +1 -0
  16. package/dist/graph/graph.builder.olink.d.ts +12 -0
  17. package/dist/graph/graph.builder.olink.js +32 -0
  18. package/dist/graph/graph.builder.olink.js.map +1 -0
  19. package/dist/graph/graph.graph.d.ts +13 -0
  20. package/dist/graph/graph.graph.js +26 -0
  21. package/dist/graph/graph.graph.js.map +1 -0
  22. package/dist/graph/graph.graphItem.d.ts +14 -0
  23. package/dist/graph/graph.graphItem.js +36 -0
  24. package/dist/graph/graph.graphItem.js.map +1 -0
  25. package/dist/graph/graph.interfaces.builder.d.ts +28 -0
  26. package/dist/graph/graph.interfaces.builder.js +2 -0
  27. package/dist/graph/graph.interfaces.builder.js.map +1 -0
  28. package/dist/graph/graph.interfaces.d.ts +59 -0
  29. package/dist/graph/graph.interfaces.js +51 -0
  30. package/dist/graph/graph.interfaces.js.map +1 -0
  31. package/dist/graph/graph.node.d.ts +12 -0
  32. package/dist/graph/graph.node.js +22 -0
  33. package/dist/graph/graph.node.js.map +1 -0
  34. package/dist/graph/graph.olink.d.ts +13 -0
  35. package/dist/graph/graph.olink.js +56 -0
  36. package/dist/graph/graph.olink.js.map +1 -0
  37. package/dist/graph/index.d.ts +9 -0
  38. package/dist/graph/index.js +10 -0
  39. package/dist/graph/index.js.map +1 -0
  40. package/dist/index.d.ts +6 -0
  41. package/dist/index.js +15 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/neuralnetwork/ann/index.d.ts +1 -0
  44. package/dist/neuralnetwork/ann/index.js +2 -0
  45. package/dist/neuralnetwork/ann/index.js.map +1 -0
  46. package/dist/neuralnetwork/ann/mlp/index.d.ts +9 -0
  47. package/dist/neuralnetwork/ann/mlp/index.js +10 -0
  48. package/dist/neuralnetwork/ann/mlp/index.js.map +1 -0
  49. package/dist/neuralnetwork/ann/mlp/mlp.activation.d.ts +22 -0
  50. package/dist/neuralnetwork/ann/mlp/mlp.activation.js +22 -0
  51. package/dist/neuralnetwork/ann/mlp/mlp.activation.js.map +1 -0
  52. package/dist/neuralnetwork/ann/mlp/mlp.builder.d.ts +43 -0
  53. package/dist/neuralnetwork/ann/mlp/mlp.builder.js +168 -0
  54. package/dist/neuralnetwork/ann/mlp/mlp.builder.js.map +1 -0
  55. package/dist/neuralnetwork/ann/mlp/mlp.graph.d.ts +7 -0
  56. package/dist/neuralnetwork/ann/mlp/mlp.graph.js +7 -0
  57. package/dist/neuralnetwork/ann/mlp/mlp.graph.js.map +1 -0
  58. package/dist/neuralnetwork/ann/mlp/mlp.inference.d.ts +13 -0
  59. package/dist/neuralnetwork/ann/mlp/mlp.inference.js +63 -0
  60. package/dist/neuralnetwork/ann/mlp/mlp.inference.js.map +1 -0
  61. package/dist/neuralnetwork/ann/mlp/mlp.interfaces.d.ts +21 -0
  62. package/dist/neuralnetwork/ann/mlp/mlp.interfaces.js +7 -0
  63. package/dist/neuralnetwork/ann/mlp/mlp.interfaces.js.map +1 -0
  64. package/dist/neuralnetwork/ann/mlp/mlp.neuron.d.ts +10 -0
  65. package/dist/neuralnetwork/ann/mlp/mlp.neuron.js +20 -0
  66. package/dist/neuralnetwork/ann/mlp/mlp.neuron.js.map +1 -0
  67. package/dist/neuralnetwork/ann/mlp/mlp.runtime.utils.d.ts +5 -0
  68. package/dist/neuralnetwork/ann/mlp/mlp.runtime.utils.js +48 -0
  69. package/dist/neuralnetwork/ann/mlp/mlp.runtime.utils.js.map +1 -0
  70. package/dist/neuralnetwork/ann/mlp/mlp.synapse.d.ts +6 -0
  71. package/dist/neuralnetwork/ann/mlp/mlp.synapse.js +7 -0
  72. package/dist/neuralnetwork/ann/mlp/mlp.synapse.js.map +1 -0
  73. package/dist/neuralnetwork/ann/mlp/training/index.d.ts +4 -0
  74. package/dist/neuralnetwork/ann/mlp/training/index.js +5 -0
  75. package/dist/neuralnetwork/ann/mlp/training/index.js.map +1 -0
  76. package/dist/neuralnetwork/ann/mlp/training/mlp.loss.d.ts +10 -0
  77. package/dist/neuralnetwork/ann/mlp/training/mlp.loss.js +11 -0
  78. package/dist/neuralnetwork/ann/mlp/training/mlp.loss.js.map +1 -0
  79. package/dist/neuralnetwork/ann/mlp/training/mlp.optimizers.d.ts +7 -0
  80. package/dist/neuralnetwork/ann/mlp/training/mlp.optimizers.js +59 -0
  81. package/dist/neuralnetwork/ann/mlp/training/mlp.optimizers.js.map +1 -0
  82. package/dist/neuralnetwork/ann/mlp/training/mlp.training.d.ts +22 -0
  83. package/dist/neuralnetwork/ann/mlp/training/mlp.training.interfaces.d.ts +27 -0
  84. package/dist/neuralnetwork/ann/mlp/training/mlp.training.interfaces.js +2 -0
  85. package/dist/neuralnetwork/ann/mlp/training/mlp.training.interfaces.js.map +1 -0
  86. package/dist/neuralnetwork/ann/mlp/training/mlp.training.js +107 -0
  87. package/dist/neuralnetwork/ann/mlp/training/mlp.training.js.map +1 -0
  88. package/dist/neuralnetwork/index.d.ts +8 -0
  89. package/dist/neuralnetwork/index.js +9 -0
  90. package/dist/neuralnetwork/index.js.map +1 -0
  91. package/dist/neuralnetwork/nn.builders.d.ts +21 -0
  92. package/dist/neuralnetwork/nn.builders.js +71 -0
  93. package/dist/neuralnetwork/nn.builders.js.map +1 -0
  94. package/dist/neuralnetwork/nn.interfaces.builder.d.ts +16 -0
  95. package/dist/neuralnetwork/nn.interfaces.builder.js +2 -0
  96. package/dist/neuralnetwork/nn.interfaces.builder.js.map +1 -0
  97. package/dist/neuralnetwork/nn.interfaces.d.ts +16 -0
  98. package/dist/neuralnetwork/nn.interfaces.js +18 -0
  99. package/dist/neuralnetwork/nn.interfaces.js.map +1 -0
  100. package/dist/neuralnetwork/nn.neuron.d.ts +8 -0
  101. package/dist/neuralnetwork/nn.neuron.js +10 -0
  102. package/dist/neuralnetwork/nn.neuron.js.map +1 -0
  103. package/dist/neuralnetwork/nn.synapse.d.ts +6 -0
  104. package/dist/neuralnetwork/nn.synapse.js +14 -0
  105. package/dist/neuralnetwork/nn.synapse.js.map +1 -0
  106. package/dist/neuralnetwork/nn.weights.d.ts +42 -0
  107. package/dist/neuralnetwork/nn.weights.js +120 -0
  108. package/dist/neuralnetwork/nn.weights.js.map +1 -0
  109. package/dist/neuralnetwork/snn/index.d.ts +3 -0
  110. package/dist/neuralnetwork/snn/index.js +4 -0
  111. package/dist/neuralnetwork/snn/index.js.map +1 -0
  112. package/dist/neuralnetwork/snn/spike.interfaces.d.ts +50 -0
  113. package/dist/neuralnetwork/snn/spike.interfaces.js +24 -0
  114. package/dist/neuralnetwork/snn/spike.interfaces.js.map +1 -0
  115. package/dist/neuralnetwork/snn/spike.runtime.d.ts +31 -0
  116. package/dist/neuralnetwork/snn/spike.runtime.js +90 -0
  117. package/dist/neuralnetwork/snn/spike.runtime.js.map +1 -0
  118. package/dist/neuralnetwork/snn/spike.stdp.d.ts +11 -0
  119. package/dist/neuralnetwork/snn/spike.stdp.js +33 -0
  120. package/dist/neuralnetwork/snn/spike.stdp.js.map +1 -0
  121. package/dist/types.d.ts +3 -0
  122. package/dist/types.js +2 -0
  123. package/dist/types.js.map +1 -0
  124. package/dist/utils/csv.d.ts +6 -0
  125. package/dist/utils/csv.js +36 -0
  126. package/dist/utils/csv.js.map +1 -0
  127. package/dist/utils/index.d.ts +1 -0
  128. package/dist/utils/index.js +2 -0
  129. package/dist/utils/index.js.map +1 -0
  130. package/package.json +44 -0
@@ -0,0 +1,56 @@
1
+ import { ICartesian2, ICartesian3, ICartesian4 } from "./geometry.interfaces";
2
+ export declare class Cartesian2 implements ICartesian2 {
3
+ x: number;
4
+ y: number;
5
+ static Zero(): ICartesian2;
6
+ static One(): ICartesian2;
7
+ static Infinity(): ICartesian2;
8
+ constructor(x?: number, y?: number);
9
+ protected newThis(...args: any[]): this;
10
+ distance(b: ICartesian2): number;
11
+ subtract(b: ICartesian2): this;
12
+ add(b: ICartesian2): this;
13
+ addInPlace(b: ICartesian2): this;
14
+ multiplyByScalar(n: number): this;
15
+ divideByScalar(n: number): this;
16
+ magnitude(): number;
17
+ clone(): this;
18
+ toString(): string;
19
+ }
20
+ export declare class Cartesian3 extends Cartesian2 implements ICartesian3 {
21
+ z: number;
22
+ static Zero(): ICartesian3;
23
+ static One(): ICartesian3;
24
+ static Infinity(): ICartesian3;
25
+ constructor(x?: number, y?: number, z?: number);
26
+ distance(b: ICartesian3): number;
27
+ subtract(b: ICartesian3): this;
28
+ add(b: ICartesian3): this;
29
+ addInPlace(b: ICartesian3): this;
30
+ multiplyByScalar(n: number): this;
31
+ divideByScalar(n: number): this;
32
+ magnitude(): number;
33
+ clone(): this;
34
+ toString(): string;
35
+ }
36
+ export declare class Cartesian4 extends Cartesian3 implements ICartesian4 {
37
+ w: number;
38
+ static Zero(): ICartesian4;
39
+ static One(): ICartesian4;
40
+ static Infinity(): ICartesian4;
41
+ constructor(x?: number, y?: number, z?: number, w?: number);
42
+ static Point(x: number, y: number, z: number): Cartesian4;
43
+ static Vector(x: number, y: number, z: number): Cartesian4;
44
+ get isVector(): boolean;
45
+ get isPoint(): boolean;
46
+ private static canon;
47
+ distance(b: ICartesian4): number;
48
+ subtract(b: ICartesian4): this;
49
+ add(b: ICartesian4): this;
50
+ addInPlace(b: ICartesian4): this;
51
+ multiplyByScalar(n: number): this;
52
+ divideByScalar(n: number): this;
53
+ magnitude(): number;
54
+ clone(): this;
55
+ toString(): string;
56
+ }
@@ -0,0 +1,229 @@
1
+ export class Cartesian2 {
2
+ static Zero() {
3
+ return new Cartesian2(0, 0);
4
+ }
5
+ static One() {
6
+ return new Cartesian2(1, 1);
7
+ }
8
+ static Infinity() {
9
+ return new Cartesian2(Infinity, Infinity);
10
+ }
11
+ constructor(x = 0, y = 0) {
12
+ this.x = x;
13
+ this.y = y;
14
+ }
15
+ // Variadic helper: works for 2D/3D/4D without overriding
16
+ newThis(...args) {
17
+ const C = this.constructor;
18
+ return new C(...args);
19
+ }
20
+ distance(b) {
21
+ const dx = b.x - this.x, dy = b.y - this.y;
22
+ return Math.hypot(dx, dy);
23
+ }
24
+ subtract(b) {
25
+ return this.newThis(this.x - b.x, this.y - b.y);
26
+ }
27
+ add(b) {
28
+ return this.newThis(this.x + b.x, this.y + b.y);
29
+ }
30
+ addInPlace(b) {
31
+ this.x += b.x;
32
+ this.y += b.y;
33
+ return this;
34
+ }
35
+ multiplyByScalar(n) {
36
+ return this.newThis(this.x * n, this.y * n);
37
+ }
38
+ divideByScalar(n) {
39
+ if (n === 0)
40
+ throw new Error("Divide by zero");
41
+ return this.newThis(this.x / n, this.y / n);
42
+ }
43
+ magnitude() {
44
+ return Math.hypot(this.x, this.y);
45
+ }
46
+ clone() {
47
+ return this.newThis(this.x, this.y);
48
+ }
49
+ toString() {
50
+ return `x:${this.x}, y:${this.y}`;
51
+ }
52
+ }
53
+ export class Cartesian3 extends Cartesian2 {
54
+ static Zero() {
55
+ return new Cartesian3(0, 0, 0);
56
+ }
57
+ static One() {
58
+ return new Cartesian3(1, 1, 1);
59
+ }
60
+ static Infinity() {
61
+ return new Cartesian3(Infinity, Infinity, Infinity);
62
+ }
63
+ constructor(x = 0, y = 0, z = 0) {
64
+ super(x, y);
65
+ this.z = z;
66
+ }
67
+ distance(b) {
68
+ const dx = b.x - this.x, dy = b.y - this.y, dz = b.z - this.z;
69
+ return Math.hypot(dx, dy, dz);
70
+ }
71
+ subtract(b) {
72
+ return this.newThis(this.x - b.x, this.y - b.y, this.z - b.z);
73
+ }
74
+ add(b) {
75
+ return this.newThis(this.x + b.x, this.y + b.y, this.z + b.z);
76
+ }
77
+ addInPlace(b) {
78
+ this.x += b.x;
79
+ this.y += b.y;
80
+ this.z += b.z;
81
+ return this;
82
+ }
83
+ multiplyByScalar(n) {
84
+ return this.newThis(this.x * n, this.y * n, this.z * n);
85
+ }
86
+ divideByScalar(n) {
87
+ if (n === 0)
88
+ throw new Error("Divide by zero");
89
+ return this.newThis(this.x / n, this.y / n, this.z / n);
90
+ }
91
+ magnitude() {
92
+ return Math.hypot(this.x, this.y, this.z);
93
+ }
94
+ clone() {
95
+ return this.newThis(this.x, this.y, this.z);
96
+ }
97
+ toString() {
98
+ return `${super.toString()}, z:${this.z}`;
99
+ }
100
+ }
101
+ export class Cartesian4 extends Cartesian3 {
102
+ static Zero() {
103
+ // Zero point by convention
104
+ return new Cartesian4(0, 0, 0, 1);
105
+ }
106
+ static One() {
107
+ return new Cartesian4(1, 1, 1, 1);
108
+ }
109
+ static Infinity() {
110
+ // Not very meaningful for homogeneous, but keep API parity
111
+ return new Cartesian4(Infinity, Infinity, Infinity, 1);
112
+ }
113
+ constructor(x = 0, y = 0, z = 0, w = 1) {
114
+ super(x, y, z);
115
+ this.w = w;
116
+ // Canonicalize: if a point has w != 0 and w != 1, divide through
117
+ if (this.w !== 0 && this.w !== 1) {
118
+ this.x /= this.w;
119
+ this.y /= this.w;
120
+ this.z /= this.w;
121
+ this.w = 1;
122
+ }
123
+ }
124
+ // Convenience constructors
125
+ static Point(x, y, z) {
126
+ return new Cartesian4(x, y, z, 1);
127
+ }
128
+ static Vector(x, y, z) {
129
+ return new Cartesian4(x, y, z, 0);
130
+ }
131
+ // Type guards
132
+ get isVector() {
133
+ return this.w === 0;
134
+ }
135
+ get isPoint() {
136
+ return this.w !== 0;
137
+ }
138
+ // Ensure input is in canonical form for ops
139
+ static canon(b) {
140
+ if (b.w === 0)
141
+ return { x: b.x, y: b.y, z: b.z, w: 0 };
142
+ if (b.w === 1)
143
+ return { x: b.x, y: b.y, z: b.z, w: 1 };
144
+ return { x: b.x / b.w, y: b.y / b.w, z: b.z / b.w, w: 1 };
145
+ }
146
+ distance(b) {
147
+ const A = this.isVector ? { x: this.x, y: this.y, z: this.z, w: 0 } : { x: this.x, y: this.y, z: this.z, w: 1 };
148
+ const B = Cartesian4.canon(b);
149
+ if (A.w === 0 || B.w === 0) {
150
+ throw new Error("distance is only defined between points (w != 0)");
151
+ }
152
+ const dx = B.x - A.x, dy = B.y - A.y, dz = B.z - A.z;
153
+ return Math.hypot(dx, dy, dz);
154
+ }
155
+ subtract(b) {
156
+ const A = this.isVector ? { x: this.x, y: this.y, z: this.z, w: 0 } : { x: this.x, y: this.y, z: this.z, w: 1 };
157
+ const B = Cartesian4.canon(b);
158
+ // point - point -> vector
159
+ if (A.w === 1 && B.w === 1) {
160
+ return this.newThis(A.x - B.x, A.y - B.y, A.z - B.z, 0);
161
+ }
162
+ // point - vector -> point
163
+ if (A.w === 1 && B.w === 0) {
164
+ return this.newThis(A.x - B.x, A.y - B.y, A.z - B.z, 1);
165
+ }
166
+ // vector - vector -> vector
167
+ if (A.w === 0 && B.w === 0) {
168
+ return this.newThis(A.x - B.x, A.y - B.y, A.z - B.z, 0);
169
+ }
170
+ // vector - point undefined
171
+ throw new Error("vector - point is undefined in homogeneous coordinates");
172
+ }
173
+ add(b) {
174
+ const A = this.isVector ? { x: this.x, y: this.y, z: this.z, w: 0 } : { x: this.x, y: this.y, z: this.z, w: 1 };
175
+ const B = Cartesian4.canon(b);
176
+ // point + vector -> point
177
+ if (A.w === 1 && B.w === 0) {
178
+ return this.newThis(A.x + B.x, A.y + B.y, A.z + B.z, 1);
179
+ }
180
+ // vector + point -> point
181
+ if (A.w === 0 && B.w === 1) {
182
+ return this.newThis(A.x + B.x, A.y + B.y, A.z + B.z, 1);
183
+ }
184
+ // vector + vector -> vector
185
+ if (A.w === 0 && B.w === 0) {
186
+ return this.newThis(A.x + B.x, A.y + B.y, A.z + B.z, 0);
187
+ }
188
+ // point + point undefined
189
+ throw new Error("point + point is undefined in homogeneous coordinates");
190
+ }
191
+ addInPlace(b) {
192
+ // Implement using add for correctness, then copy into this
193
+ const r = this.add(b);
194
+ this.x = r.x;
195
+ this.y = r.y;
196
+ this.z = r.z;
197
+ this.w = r.w;
198
+ return this;
199
+ }
200
+ multiplyByScalar(n) {
201
+ // Scale directions naturally; for points, scale position from origin
202
+ if (this.isVector) {
203
+ return this.newThis(this.x * n, this.y * n, this.z * n, 0);
204
+ }
205
+ return this.newThis(this.x * n, this.y * n, this.z * n, 1);
206
+ }
207
+ divideByScalar(n) {
208
+ if (n === 0)
209
+ throw new Error("Divide by zero");
210
+ if (this.isVector) {
211
+ return this.newThis(this.x / n, this.y / n, this.z / n, 0);
212
+ }
213
+ return this.newThis(this.x / n, this.y / n, this.z / n, 1);
214
+ }
215
+ magnitude() {
216
+ // Only meaningful for vectors
217
+ if (!this.isVector) {
218
+ throw new Error("magnitude is only defined for vectors (w = 0) in homogeneous coords");
219
+ }
220
+ return Math.hypot(this.x, this.y, this.z);
221
+ }
222
+ clone() {
223
+ return this.newThis(this.x, this.y, this.z, this.w);
224
+ }
225
+ toString() {
226
+ return `x:${this.x}, y:${this.y}, z:${this.z}, w:${this.w}`;
227
+ }
228
+ }
229
+ //# sourceMappingURL=geometry.cartesian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.cartesian.js","sourceRoot":"","sources":["../../src/geometry/geometry.cartesian.ts"],"names":[],"mappings":"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","sourcesContent":["import { ICartesian2, ICartesian3, ICartesian4 } from \"./geometry.interfaces\";\r\n\r\nexport class Cartesian2 implements ICartesian2 {\r\n public static Zero(): ICartesian2 {\r\n return new Cartesian2(0, 0);\r\n }\r\n public static One(): ICartesian2 {\r\n return new Cartesian2(1, 1);\r\n }\r\n public static Infinity(): ICartesian2 {\r\n return new Cartesian2(Infinity, Infinity);\r\n }\r\n\r\n public constructor(public x: number = 0, public y: number = 0) {}\r\n\r\n // Variadic helper: works for 2D/3D/4D without overriding\r\n protected newThis(...args: any[]): this {\r\n const C = this.constructor as new (...a: any[]) => this;\r\n return new C(...args);\r\n }\r\n\r\n public distance(b: ICartesian2): number {\r\n const dx = b.x - this.x, dy = b.y - this.y;\r\n return Math.hypot(dx, dy);\r\n }\r\n\r\n public subtract(b: ICartesian2): this {\r\n return this.newThis(this.x - b.x, this.y - b.y);\r\n }\r\n\r\n public add(b: ICartesian2): this {\r\n return this.newThis(this.x + b.x, this.y + b.y);\r\n }\r\n\r\n public addInPlace(b: ICartesian2): this {\r\n this.x += b.x;\r\n this.y += b.y;\r\n return this;\r\n }\r\n\r\n public multiplyByScalar(n: number): this {\r\n return this.newThis(this.x * n, this.y * n);\r\n }\r\n\r\n public divideByScalar(n: number): this {\r\n if (n === 0) throw new Error(\"Divide by zero\");\r\n return this.newThis(this.x / n, this.y / n);\r\n }\r\n\r\n public magnitude(): number {\r\n return Math.hypot(this.x, this.y);\r\n }\r\n\r\n public clone(): this {\r\n return this.newThis(this.x, this.y);\r\n }\r\n\r\n public toString(): string {\r\n return `x:${this.x}, y:${this.y}`;\r\n }\r\n}\r\n\r\nexport class Cartesian3 extends Cartesian2 implements ICartesian3 {\r\n public static Zero(): ICartesian3 {\r\n return new Cartesian3(0, 0, 0);\r\n }\r\n public static One(): ICartesian3 {\r\n return new Cartesian3(1, 1, 1);\r\n }\r\n public static Infinity(): ICartesian3 {\r\n return new Cartesian3(Infinity, Infinity, Infinity);\r\n }\r\n\r\n public constructor(x: number = 0, y: number = 0, public z: number = 0) {\r\n super(x, y);\r\n }\r\n\r\n public override distance(b: ICartesian3): number {\r\n const dx = b.x - this.x, dy = b.y - this.y, dz = b.z - this.z;\r\n return Math.hypot(dx, dy, dz);\r\n }\r\n\r\n public subtract(b: ICartesian3): this {\r\n return this.newThis(this.x - b.x, this.y - b.y, this.z - b.z);\r\n }\r\n\r\n public add(b: ICartesian3): this {\r\n return this.newThis(this.x + b.x, this.y + b.y, this.z + b.z);\r\n }\r\n\r\n public override addInPlace(b: ICartesian3): this {\r\n this.x += b.x;\r\n this.y += b.y;\r\n this.z += b.z;\r\n return this;\r\n }\r\n\r\n public override multiplyByScalar(n: number): this {\r\n return this.newThis(this.x * n, this.y * n, this.z * n);\r\n }\r\n\r\n public override divideByScalar(n: number): this {\r\n if (n === 0) throw new Error(\"Divide by zero\");\r\n return this.newThis(this.x / n, this.y / n, this.z / n);\r\n }\r\n\r\n public override magnitude(): number {\r\n return Math.hypot(this.x, this.y, this.z);\r\n }\r\n\r\n public override clone(): this {\r\n return this.newThis(this.x, this.y, this.z);\r\n }\r\n\r\n public override toString(): string {\r\n return `${super.toString()}, z:${this.z}`;\r\n }\r\n}\r\n\r\nexport class Cartesian4 extends Cartesian3 implements ICartesian4 {\r\n public static Zero(): ICartesian4 {\r\n // Zero point by convention\r\n return new Cartesian4(0, 0, 0, 1);\r\n }\r\n public static One(): ICartesian4 {\r\n return new Cartesian4(1, 1, 1, 1);\r\n }\r\n public static Infinity(): ICartesian4 {\r\n // Not very meaningful for homogeneous, but keep API parity\r\n return new Cartesian4(Infinity, Infinity, Infinity, 1);\r\n }\r\n\r\n public constructor(x: number = 0, y: number = 0, z: number = 0, public w: number = 1) {\r\n super(x, y, z);\r\n // Canonicalize: if a point has w != 0 and w != 1, divide through\r\n if (this.w !== 0 && this.w !== 1) {\r\n this.x /= this.w;\r\n this.y /= this.w;\r\n this.z /= this.w;\r\n this.w = 1;\r\n }\r\n }\r\n\r\n // Convenience constructors\r\n public static Point(x: number, y: number, z: number): Cartesian4 {\r\n return new Cartesian4(x, y, z, 1);\r\n }\r\n public static Vector(x: number, y: number, z: number): Cartesian4 {\r\n return new Cartesian4(x, y, z, 0);\r\n }\r\n\r\n // Type guards\r\n public get isVector(): boolean {\r\n return this.w === 0;\r\n }\r\n public get isPoint(): boolean {\r\n return this.w !== 0;\r\n }\r\n\r\n // Ensure input is in canonical form for ops\r\n private static canon(b: ICartesian4): { x: number; y: number; z: number; w: number } {\r\n if (b.w === 0) return { x: b.x, y: b.y, z: b.z, w: 0 };\r\n if (b.w === 1) return { x: b.x, y: b.y, z: b.z, w: 1 };\r\n return { x: b.x / b.w, y: b.y / b.w, z: b.z / b.w, w: 1 };\r\n }\r\n\r\n public override distance(b: ICartesian4): number {\r\n const A = this.isVector ? { x: this.x, y: this.y, z: this.z, w: 0 } : { x: this.x, y: this.y, z: this.z, w: 1 };\r\n const B = Cartesian4.canon(b);\r\n if (A.w === 0 || B.w === 0) {\r\n throw new Error(\"distance is only defined between points (w != 0)\");\r\n }\r\n const dx = B.x - A.x, dy = B.y - A.y, dz = B.z - A.z;\r\n return Math.hypot(dx, dy, dz);\r\n }\r\n\r\n public subtract(b: ICartesian4): this {\r\n const A = this.isVector ? { x: this.x, y: this.y, z: this.z, w: 0 } : { x: this.x, y: this.y, z: this.z, w: 1 };\r\n const B = Cartesian4.canon(b);\r\n\r\n // point - point -> vector\r\n if (A.w === 1 && B.w === 1) {\r\n return this.newThis(A.x - B.x, A.y - B.y, A.z - B.z, 0);\r\n }\r\n // point - vector -> point\r\n if (A.w === 1 && B.w === 0) {\r\n return this.newThis(A.x - B.x, A.y - B.y, A.z - B.z, 1);\r\n }\r\n // vector - vector -> vector\r\n if (A.w === 0 && B.w === 0) {\r\n return this.newThis(A.x - B.x, A.y - B.y, A.z - B.z, 0);\r\n }\r\n // vector - point undefined\r\n throw new Error(\"vector - point is undefined in homogeneous coordinates\");\r\n }\r\n\r\n public add(b: ICartesian4): this {\r\n const A = this.isVector ? { x: this.x, y: this.y, z: this.z, w: 0 } : { x: this.x, y: this.y, z: this.z, w: 1 };\r\n const B = Cartesian4.canon(b);\r\n\r\n // point + vector -> point\r\n if (A.w === 1 && B.w === 0) {\r\n return this.newThis(A.x + B.x, A.y + B.y, A.z + B.z, 1);\r\n }\r\n // vector + point -> point\r\n if (A.w === 0 && B.w === 1) {\r\n return this.newThis(A.x + B.x, A.y + B.y, A.z + B.z, 1);\r\n }\r\n // vector + vector -> vector\r\n if (A.w === 0 && B.w === 0) {\r\n return this.newThis(A.x + B.x, A.y + B.y, A.z + B.z, 0);\r\n }\r\n // point + point undefined\r\n throw new Error(\"point + point is undefined in homogeneous coordinates\");\r\n }\r\n\r\n public override addInPlace(b: ICartesian4): this {\r\n // Implement using add for correctness, then copy into this\r\n const r = this.add(b);\r\n this.x = r.x; this.y = r.y; this.z = r.z; this.w = (r as Cartesian4).w;\r\n return this;\r\n }\r\n\r\n public override multiplyByScalar(n: number): this {\r\n // Scale directions naturally; for points, scale position from origin\r\n if (this.isVector) {\r\n return this.newThis(this.x * n, this.y * n, this.z * n, 0);\r\n }\r\n return this.newThis(this.x * n, this.y * n, this.z * n, 1);\r\n }\r\n\r\n public override divideByScalar(n: number): this {\r\n if (n === 0) throw new Error(\"Divide by zero\");\r\n if (this.isVector) {\r\n return this.newThis(this.x / n, this.y / n, this.z / n, 0);\r\n }\r\n return this.newThis(this.x / n, this.y / n, this.z / n, 1);\r\n }\r\n\r\n public override magnitude(): number {\r\n // Only meaningful for vectors\r\n if (!this.isVector) {\r\n throw new Error(\"magnitude is only defined for vectors (w = 0) in homogeneous coords\");\r\n }\r\n return Math.hypot(this.x, this.y, this.z);\r\n }\r\n\r\n public override clone(): this {\r\n return this.newThis(this.x, this.y, this.z, this.w);\r\n }\r\n\r\n public override toString(): string {\r\n return `x:${this.x}, y:${this.y}, z:${this.z}, w:${this.w}`;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,37 @@
1
+ export interface ICartesian {
2
+ distance(b: ICartesian): number;
3
+ subtract(b: ICartesian): this;
4
+ add(b: ICartesian): this;
5
+ addInPlace(b: ICartesian): this;
6
+ multiplyByScalar(n: number): this;
7
+ divideByScalar(n: number): this;
8
+ magnitude(): number;
9
+ toString(): string;
10
+ clone(): this;
11
+ }
12
+ export interface ICartesian2 extends ICartesian {
13
+ x: number;
14
+ y: number;
15
+ }
16
+ export interface ICartesian3 extends ICartesian2 {
17
+ z: number;
18
+ }
19
+ export interface ICartesian4 extends ICartesian3 {
20
+ w: number;
21
+ }
22
+ /**
23
+ * Type guard for ICartesian (ICartesian2 | ICartesian3 | ICartesian4)
24
+ */
25
+ export declare function isCartesian(obj: unknown): obj is ICartesian;
26
+ /**
27
+ * Type guard for ICartesian2
28
+ */
29
+ export declare function isCartesian2(b: unknown): b is ICartesian2 | ICartesian3 | ICartesian4;
30
+ /**
31
+ * Type guard for ICartesian3
32
+ */
33
+ export declare function isCartesian3(b: unknown): b is ICartesian3 | ICartesian4;
34
+ /**
35
+ * Type guard for ICartesian4
36
+ */
37
+ export declare function isCartesian4(b: unknown): b is ICartesian4;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Type guard for ICartesian (ICartesian2 | ICartesian3 | ICartesian4)
3
+ */
4
+ export function isCartesian(obj) {
5
+ return isCartesian2(obj) || isCartesian3(obj) || isCartesian4(obj);
6
+ }
7
+ /**
8
+ * Type guard for ICartesian2
9
+ */
10
+ export function isCartesian2(b) {
11
+ if (typeof b !== "object" || b === null)
12
+ return false;
13
+ return "x" in b && "y" in b;
14
+ }
15
+ /**
16
+ * Type guard for ICartesian3
17
+ */
18
+ export function isCartesian3(b) {
19
+ if (!isCartesian2(b))
20
+ return false;
21
+ return "z" in b;
22
+ }
23
+ /**
24
+ * Type guard for ICartesian4
25
+ */
26
+ export function isCartesian4(b) {
27
+ if (!isCartesian3(b))
28
+ return false;
29
+ return "w" in b;
30
+ }
31
+ //# sourceMappingURL=geometry.interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.interfaces.js","sourceRoot":"","sources":["../../src/geometry/geometry.interfaces.ts"],"names":[],"mappings":"AA0BA;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACpC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACnC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACnC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,GAAG,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACnC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,GAAG,IAAI,CAAC,CAAC;AACpB,CAAC","sourcesContent":["\r\nexport interface ICartesian {\r\n distance(b:ICartesian) : number; \r\n subtract(b:ICartesian) : this;\r\n add(b:ICartesian) : this;\r\n addInPlace(b:ICartesian) :this;\r\n multiplyByScalar(n:number):this;\r\n divideByScalar(n:number):this;\r\n magnitude():number;\r\n toString(): string;\r\n clone(): this;\r\n}\r\n\r\nexport interface ICartesian2 extends ICartesian {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport interface ICartesian3 extends ICartesian2 {\r\n z: number;\r\n}\r\n\r\nexport interface ICartesian4 extends ICartesian3 {\r\n w: number;\r\n}\r\n\r\n/**\r\n * Type guard for ICartesian (ICartesian2 | ICartesian3 | ICartesian4)\r\n */\r\nexport function isCartesian(obj: unknown): obj is ICartesian {\r\n return isCartesian2(obj) || isCartesian3(obj) || isCartesian4(obj);\r\n}\r\n\r\n/**\r\n * Type guard for ICartesian2\r\n */\r\nexport function isCartesian2(b: unknown): b is ICartesian2 | ICartesian3 | ICartesian4 {\r\n if (typeof b !== \"object\" || b === null) return false;\r\n return \"x\" in b && \"y\" in b;\r\n}\r\n\r\n/**\r\n * Type guard for ICartesian3\r\n */\r\nexport function isCartesian3(b: unknown): b is ICartesian3 | ICartesian4 {\r\n if (!isCartesian2(b)) return false;\r\n return \"z\" in b;\r\n}\r\n\r\n/**\r\n * Type guard for ICartesian4\r\n */\r\nexport function isCartesian4(b: unknown): b is ICartesian4 {\r\n if (!isCartesian3(b)) return false;\r\n return \"w\" in b;\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ export * from "./geometry.interfaces";
2
+ export * from "./geometry.cartesian";
@@ -0,0 +1,3 @@
1
+ export * from "./geometry.interfaces";
2
+ export * from "./geometry.cartesian";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/geometry/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAA","sourcesContent":["export * from \"./geometry.interfaces\";\r\nexport * from \"./geometry.cartesian\"\r\n"]}
@@ -0,0 +1,44 @@
1
+ import { ICartesian } from "../geometry";
2
+ import { Nullable, SingleOrArray } from "../types";
3
+ import { IGraph, INode, IOlink } from "./graph.interfaces";
4
+ import { GraphConstructor, IGraphBuilder, ILinkBuilder, INodeBuilder } from "./graph.interfaces.builder";
5
+ export declare class GraphBuilder<N extends INode, L extends IOlink> implements IGraphBuilder<N, L> {
6
+ private _position?;
7
+ private _inputs;
8
+ private _outputs;
9
+ private _ctor;
10
+ private _nodes;
11
+ private _links;
12
+ /**
13
+ * Set the graph type to construct.
14
+ */
15
+ withType<T extends IGraph<N, L>>(c: GraphConstructor<N, L, T>): IGraphBuilder<N, L>;
16
+ /**
17
+ * Set the node position. The graph is assumed to being a node through inheritance.
18
+ */
19
+ withNodePosition(p: ICartesian): IGraphBuilder<N, L>;
20
+ /**
21
+ * Set input links.The graph is assumed to being a node through inheritance.
22
+ */
23
+ withNodeInputs(link: SingleOrArray<L> | SingleOrArray<ILinkBuilder>): IGraphBuilder<N, L>;
24
+ /**
25
+ * Set output links.The graph is assumed to being a node through inheritance.
26
+ */
27
+ withNodeOutputs(link: SingleOrArray<L> | SingleOrArray<ILinkBuilder>): IGraphBuilder<N, L>;
28
+ /**
29
+ * Add nodes to the graph.
30
+ */
31
+ withNodes(nodes: SingleOrArray<N> | SingleOrArray<INodeBuilder>): IGraphBuilder<N, L>;
32
+ /**
33
+ * Add links to the graph.
34
+ */
35
+ withLinks(link: SingleOrArray<L> | SingleOrArray<ILinkBuilder>): IGraphBuilder<N, L>;
36
+ /**
37
+ * Build and return the graph.
38
+ */
39
+ build<T extends IGraph<N, L>>(...args: any[]): Nullable<T>;
40
+ /**
41
+ * Reset the builder to its initial state.
42
+ */
43
+ reset(): IGraphBuilder<N, L>;
44
+ }
@@ -0,0 +1,78 @@
1
+ import { GraphNodeBuilder } from "./graph.builder.node";
2
+ import { Graph } from "./graph.graph";
3
+ import { isNode, isOlink } from "./graph.interfaces";
4
+ export class GraphBuilder {
5
+ constructor() {
6
+ this._inputs = null;
7
+ this._outputs = null;
8
+ this._ctor = Graph; // Default constructor
9
+ this._nodes = [];
10
+ this._links = [];
11
+ }
12
+ /**
13
+ * Set the graph type to construct.
14
+ */
15
+ withType(c) {
16
+ this._ctor = c;
17
+ return this;
18
+ }
19
+ /**
20
+ * Set the node position. The graph is assumed to being a node through inheritance.
21
+ */
22
+ withNodePosition(p) {
23
+ this._position = p;
24
+ return this;
25
+ }
26
+ /**
27
+ * Set input links.The graph is assumed to being a node through inheritance.
28
+ */
29
+ withNodeInputs(link) {
30
+ this._inputs = this._inputs ?? [];
31
+ this._inputs.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, (isOlink)));
32
+ return this;
33
+ }
34
+ /**
35
+ * Set output links.The graph is assumed to being a node through inheritance.
36
+ */
37
+ withNodeOutputs(link) {
38
+ this._outputs = this._outputs ?? [];
39
+ this._outputs.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, (isOlink)));
40
+ return this;
41
+ }
42
+ /**
43
+ * Add nodes to the graph.
44
+ */
45
+ withNodes(nodes) {
46
+ this._nodes.push(...GraphNodeBuilder.ResolveLinksOrNodes(nodes, (isNode)));
47
+ return this;
48
+ }
49
+ /**
50
+ * Add links to the graph.
51
+ */
52
+ withLinks(link) {
53
+ this._links.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, (isOlink)));
54
+ return this;
55
+ }
56
+ /**
57
+ * Build and return the graph.
58
+ */
59
+ build(...args) {
60
+ const ctr = this._ctor ?? Graph;
61
+ return new ctr(this._nodes, this._links, null, null, null,
62
+ // this is the node part of the graph (graph are also node..)
63
+ this._inputs ? [...this._inputs] : null, this._outputs ? [...this._outputs] : null, this._position, ...args);
64
+ }
65
+ /**
66
+ * Reset the builder to its initial state.
67
+ */
68
+ reset() {
69
+ this._position = undefined;
70
+ this._inputs = null;
71
+ this._outputs = null;
72
+ this._ctor = Graph; // Reset to default constructor
73
+ this._nodes = [];
74
+ this._links = [];
75
+ return this;
76
+ }
77
+ }
78
+ //# sourceMappingURL=graph.builder.graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.builder.graph.js","sourceRoot":"","sources":["../../src/graph/graph.builder.graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { ICartesian } from \"../geometry\";\r\nimport { Nullable, SingleOrArray } from \"../types\";\r\nimport { GraphNodeBuilder } from \"./graph.builder.node\";\r\nimport { Graph } from \"./graph.graph\";\r\nimport { IGraph, INode, IOlink, isNode, isOlink } from \"./graph.interfaces\";\r\nimport { GraphConstructor, IGraphBuilder, ILinkBuilder, INodeBuilder } from \"./graph.interfaces.builder\";\r\n\r\nexport class GraphBuilder<N extends INode, L extends IOlink> implements IGraphBuilder<N, L> {\r\n private _position?: ICartesian;\r\n private _inputs: Nullable<Array<L>> = null;\r\n private _outputs: Nullable<Array<L>> = null;\r\n private _ctor: GraphConstructor<any, any, any> = Graph; // Default constructor\r\n private _nodes: N[] = [];\r\n private _links: L[] = [];\r\n\r\n /**\r\n * Set the graph type to construct.\r\n */\r\n public withType<T extends IGraph<N, L>>(c: GraphConstructor<N, L, T>): IGraphBuilder<N, L> {\r\n this._ctor = c;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the node position. The graph is assumed to being a node through inheritance.\r\n */\r\n public withNodePosition(p: ICartesian): IGraphBuilder<N, L> {\r\n this._position = p;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set input links.The graph is assumed to being a node through inheritance.\r\n */\r\n public withNodeInputs(link: SingleOrArray<L> | SingleOrArray<ILinkBuilder>): IGraphBuilder<N, L> {\r\n this._inputs = this._inputs ?? [];\r\n this._inputs.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, isOlink<L>));\r\n return this;\r\n }\r\n\r\n /**\r\n * Set output links.The graph is assumed to being a node through inheritance.\r\n */\r\n public withNodeOutputs(link: SingleOrArray<L> | SingleOrArray<ILinkBuilder>): IGraphBuilder<N, L> {\r\n this._outputs = this._outputs ?? [];\r\n this._outputs.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, isOlink<L>));\r\n return this;\r\n }\r\n\r\n /**\r\n * Add nodes to the graph.\r\n */\r\n public withNodes(nodes: SingleOrArray<N> | SingleOrArray<INodeBuilder>): IGraphBuilder<N, L> {\r\n this._nodes.push(...GraphNodeBuilder.ResolveLinksOrNodes(nodes, isNode<N>));\r\n return this;\r\n }\r\n\r\n /**\r\n * Add links to the graph.\r\n */\r\n public withLinks(link: SingleOrArray<L> | SingleOrArray<ILinkBuilder>): IGraphBuilder<N, L> {\r\n this._links.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, isOlink<L>));\r\n return this;\r\n }\r\n\r\n /**\r\n * Build and return the graph.\r\n */\r\n public build<T extends IGraph<N, L>>(...args: any[]): Nullable<T> {\r\n const ctr = (this._ctor as GraphConstructor<N, L, IGraph<N, L>>) ?? Graph;\r\n return new ctr(\r\n this._nodes as N[],\r\n this._links as L[],\r\n null,\r\n null,\r\n null,\r\n // this is the node part of the graph (graph are also node..)\r\n this._inputs ? ([...this._inputs] as L[]) : null,\r\n this._outputs ? ([...this._outputs] as L[]) : null,\r\n this._position,\r\n ...args\r\n ) as T;\r\n }\r\n\r\n /**\r\n * Reset the builder to its initial state.\r\n */\r\n public reset(): IGraphBuilder<N, L> {\r\n this._position = undefined;\r\n this._inputs = null;\r\n this._outputs = null;\r\n this._ctor = Graph; // Reset to default constructor\r\n this._nodes = [];\r\n this._links = [];\r\n return this;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,20 @@
1
+ import { ICartesian } from "../geometry";
2
+ import { SingleOrArray } from "../types";
3
+ import { INode, IOlink } from "./graph.interfaces";
4
+ import { ILinkBuilder, INodeBuilder, NodeConstructor } from "./graph.interfaces.builder";
5
+ export declare class GraphNodeBuilder implements INodeBuilder {
6
+ /**
7
+ * Helper function to normalize SingleOrArray inputs and convert builders if necessary.
8
+ */
9
+ static ResolveLinksOrNodes<T, B>(items: SingleOrArray<T | B>, isType: (item: T | B) => item is T): T[];
10
+ private _ctor;
11
+ private _position?;
12
+ private _inputs;
13
+ private _outputs;
14
+ withType<T extends INode>(ctor: NodeConstructor<T>): INodeBuilder;
15
+ withPosition(p: ICartesian): INodeBuilder;
16
+ withInputs(link: SingleOrArray<IOlink> | SingleOrArray<ILinkBuilder>): INodeBuilder;
17
+ withOutputs(link: SingleOrArray<IOlink> | SingleOrArray<ILinkBuilder>): INodeBuilder;
18
+ build(...args: any[]): INode;
19
+ reset(): INodeBuilder;
20
+ }
@@ -0,0 +1,45 @@
1
+ import { isOlink } from "./graph.interfaces";
2
+ import { GraphNode } from "./graph.node";
3
+ export class GraphNodeBuilder {
4
+ constructor() {
5
+ this._ctor = GraphNode; // Default constructor
6
+ this._inputs = null;
7
+ this._outputs = null;
8
+ }
9
+ /**
10
+ * Helper function to normalize SingleOrArray inputs and convert builders if necessary.
11
+ */
12
+ static ResolveLinksOrNodes(items, isType) {
13
+ return (Array.isArray(items) ? items : [items]).map((item) => (isType(item) ? item : item.build()));
14
+ }
15
+ withType(ctor) {
16
+ this._ctor = ctor;
17
+ return this;
18
+ }
19
+ withPosition(p) {
20
+ this._position = p;
21
+ return this;
22
+ }
23
+ withInputs(link) {
24
+ this._inputs = this._inputs ?? [];
25
+ this._inputs.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, (isOlink)));
26
+ return this;
27
+ }
28
+ withOutputs(link) {
29
+ this._outputs = this._outputs ?? [];
30
+ this._outputs.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, (isOlink)));
31
+ return this;
32
+ }
33
+ build(...args) {
34
+ const ctr = this._ctor ?? GraphNode;
35
+ return new ctr(this._inputs, this._outputs, this._position, ...args);
36
+ }
37
+ reset() {
38
+ this._ctor = GraphNode; // Reset to default constructor
39
+ this._position = undefined;
40
+ this._inputs = null;
41
+ this._outputs = null;
42
+ return this;
43
+ }
44
+ }
45
+ //# sourceMappingURL=graph.builder.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.builder.node.js","sourceRoot":"","sources":["../../src/graph/graph.builder.node.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAO,gBAAgB;IAA7B;QAQY,UAAK,GAA2B,SAAS,CAAC,CAAC,sBAAsB;QAEjE,YAAO,GAA4B,IAAI,CAAC;QACxC,aAAQ,GAA4B,IAAI,CAAC;IAoCrD,CAAC;IA9CG;;OAEG;IACI,MAAM,CAAC,mBAAmB,CAAO,KAA2B,EAAE,MAAkC;QACnG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjH,CAAC;IAOM,QAAQ,CAAkB,IAAwB;QACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,YAAY,CAAC,CAAa;QAC7B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,UAAU,CAAC,IAAyD;QACvE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAA,OAAe,CAAA,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,WAAW,CAAC,IAAyD;QACxE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAA,OAAe,CAAA,CAAC,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,GAAG,IAAW;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;QACpC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,+BAA+B;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import { ICartesian } from \"../geometry\";\r\nimport { Nullable, SingleOrArray } from \"../types\";\r\nimport { INode, IOlink, isOlink } from \"./graph.interfaces\";\r\nimport { ILinkBuilder, INodeBuilder, NodeConstructor } from \"./graph.interfaces.builder\";\r\nimport { GraphNode } from \"./graph.node\";\r\n\r\nexport class GraphNodeBuilder implements INodeBuilder {\r\n /**\r\n * Helper function to normalize SingleOrArray inputs and convert builders if necessary.\r\n */\r\n public static ResolveLinksOrNodes<T, B>(items: SingleOrArray<T | B>, isType: (item: T | B) => item is T): T[] {\r\n return (Array.isArray(items) ? items : [items]).map((item) => (isType(item) ? item : (item as any).build()));\r\n }\r\n\r\n private _ctor: NodeConstructor<INode> = GraphNode; // Default constructor\r\n private _position?: ICartesian;\r\n private _inputs: Nullable<Array<IOlink>> = null;\r\n private _outputs: Nullable<Array<IOlink>> = null;\r\n\r\n public withType<T extends INode>(ctor: NodeConstructor<T>): INodeBuilder {\r\n this._ctor = ctor;\r\n return this;\r\n }\r\n\r\n public withPosition(p: ICartesian): INodeBuilder {\r\n this._position = p;\r\n return this;\r\n }\r\n\r\n public withInputs(link: SingleOrArray<IOlink> | SingleOrArray<ILinkBuilder>): INodeBuilder {\r\n this._inputs = this._inputs ?? [];\r\n this._inputs.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, isOlink<IOlink>));\r\n return this;\r\n }\r\n\r\n public withOutputs(link: SingleOrArray<IOlink> | SingleOrArray<ILinkBuilder>): INodeBuilder {\r\n this._outputs = this._outputs ?? [];\r\n this._outputs.push(...GraphNodeBuilder.ResolveLinksOrNodes(link, isOlink<IOlink>));\r\n return this;\r\n }\r\n\r\n public build(...args: any[]): INode {\r\n const ctr = this._ctor ?? GraphNode;\r\n return new ctr(this._inputs, this._outputs, this._position, ...args);\r\n }\r\n\r\n public reset(): INodeBuilder {\r\n this._ctor = GraphNode; // Reset to default constructor\r\n this._position = undefined;\r\n this._inputs = null;\r\n this._outputs = null;\r\n return this;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,12 @@
1
+ import { IOlink, INode } from "./graph.interfaces";
2
+ import { ILinkBuilder, LinkConstructor } from "./graph.interfaces.builder";
3
+ export declare class LinkBuilder implements ILinkBuilder {
4
+ private _ctor;
5
+ private _from?;
6
+ private _to?;
7
+ withType<T extends IOlink>(c: LinkConstructor<T>): ILinkBuilder;
8
+ withFrom(node: INode): ILinkBuilder;
9
+ withTo(node: INode): ILinkBuilder;
10
+ build(...args: any[]): IOlink;
11
+ reset(): ILinkBuilder;
12
+ }