@hoox-sh/pynets 0.2.0 → 0.4.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.
@@ -19,6 +19,32 @@ function cell(v: unknown): number | null {
19
19
  return naNum(v);
20
20
  }
21
21
 
22
+ /** Keep UDT/string/bool slots; only coerce non-finite numbers to `na`. */
23
+ function store(v: unknown): unknown {
24
+ if (v == null) return null;
25
+ if (typeof v === "number") return Number.isFinite(v) ? v : null;
26
+ return v;
27
+ }
28
+
29
+ function parseSortArgs(order?: unknown, sortField?: unknown): { order: "asc" | "desc"; field: unknown } {
30
+ if (sortField !== undefined && sortField !== null) {
31
+ return { order: sortOrder(order), field: sortField };
32
+ }
33
+ if (order == null) return { order: "asc", field: null };
34
+ if (typeof order === "string") {
35
+ const low = order.toLowerCase();
36
+ if (low === "ascending" || low === "descending" || low === "asc" || low === "desc" || low.includes("desc") || low.includes("asc")) {
37
+ return { order: sortOrder(order), field: null };
38
+ }
39
+ return { order: "asc", field: order };
40
+ }
41
+ if (typeof order === "number" && Number.isFinite(order)) {
42
+ if (order === 1 || order === -1) return { order: sortOrder(order), field: null };
43
+ return { order: "asc", field: order };
44
+ }
45
+ return { order: sortOrder(order), field: null };
46
+ }
47
+
22
48
  function asArray(id: unknown): PineArray | null {
23
49
  return id instanceof PineArray ? id : null;
24
50
  }
@@ -32,58 +58,69 @@ function asMatrix(id: unknown): PineMatrix | null {
32
58
  }
33
59
 
34
60
  function sortOrder(order: unknown): "asc" | "desc" {
61
+ if (typeof order === "number") return order < 0 ? "desc" : "asc";
35
62
  return String(order ?? "asc").toLowerCase().includes("desc") ? "desc" : "asc";
36
63
  }
37
64
 
38
- function wrapCells(cells: ReadonlyArray<number | null> | null | undefined): PineArray | null {
65
+ function wrapCells(cells: ReadonlyArray<unknown> | null | undefined): PineArray | null {
39
66
  if (cells == null) return null;
40
67
  const out = new PineArray();
41
- for (const v of cells) out.push(v);
68
+ for (const v of cells) out.push(store(v));
42
69
  return out;
43
70
  }
44
71
 
72
+ function storedArrayValues(id: unknown): unknown[] | undefined {
73
+ const a = asArray(id);
74
+ if (a == null) return undefined;
75
+ return a.toValues().map(store);
76
+ }
77
+
45
78
  export const compileArray = {
46
79
  new(size?: unknown, initial?: unknown): PineArray {
47
- return new PineArray(n(size, 0), cell(initial));
80
+ return new PineArray(n(size, 0), store(initial));
48
81
  },
49
- get(id: unknown, index?: unknown): number | null {
82
+ /** Variadic `array.from` — not `array.new(size, initial)`. */
83
+ from(values?: unknown): PineArray {
84
+ return wrapCells(Array.isArray(values) ? values : []) ?? new PineArray();
85
+ },
86
+ get(id: unknown, index?: unknown): unknown {
50
87
  return asArray(id)?.get(n(index, 0)) ?? null;
51
88
  },
52
89
  set(id: unknown, index?: unknown, value?: unknown): unknown {
53
- asArray(id)?.set(n(index, 0), cell(value));
90
+ asArray(id)?.set(n(index, 0), store(value));
54
91
  return id ?? null;
55
92
  },
56
93
  push(id: unknown, value?: unknown): unknown {
57
- asArray(id)?.push(cell(value));
94
+ asArray(id)?.push(store(value));
58
95
  return id ?? null;
59
96
  },
60
- pop(id: unknown): number | null {
97
+ pop(id: unknown): unknown {
61
98
  return asArray(id)?.pop() ?? null;
62
99
  },
63
100
  unshift(id: unknown, value?: unknown): unknown {
64
- asArray(id)?.unshift(cell(value));
101
+ asArray(id)?.unshift(store(value));
65
102
  return id ?? null;
66
103
  },
67
- shift(id: unknown): number | null {
104
+ shift(id: unknown): unknown {
68
105
  return asArray(id)?.shift() ?? null;
69
106
  },
70
107
  size(id: unknown): number {
71
108
  return asArray(id)?.size() ?? 0;
72
109
  },
73
110
  includes(id: unknown, value?: unknown): boolean {
74
- return asArray(id)?.includes(cell(value)) ?? false;
111
+ return asArray(id)?.includes(store(value)) ?? false;
75
112
  },
76
- first(id: unknown): number | null {
113
+ first(id: unknown): unknown {
77
114
  return asArray(id)?.first() ?? null;
78
115
  },
79
- last(id: unknown): number | null {
116
+ last(id: unknown): unknown {
80
117
  return asArray(id)?.last() ?? null;
81
118
  },
82
119
  insert(id: unknown, index?: unknown, value?: unknown): unknown {
83
- asArray(id)?.insert(n(index, 0), cell(value));
120
+ asArray(id)?.insert(n(index, 0), store(value));
84
121
  return id ?? null;
85
122
  },
86
- remove(id: unknown, index?: unknown): number | null {
123
+ remove(id: unknown, index?: unknown): unknown {
87
124
  return asArray(id)?.remove(n(index, 0)) ?? null;
88
125
  },
89
126
  clear(id: unknown): unknown {
@@ -91,7 +128,7 @@ export const compileArray = {
91
128
  return id ?? null;
92
129
  },
93
130
  fill(id: unknown, value?: unknown): unknown {
94
- asArray(id)?.fill(cell(value));
131
+ asArray(id)?.fill(store(value));
95
132
  return id ?? null;
96
133
  },
97
134
  copy(id: unknown): PineArray | null {
@@ -101,9 +138,9 @@ export const compileArray = {
101
138
  asArray(id)?.reverse();
102
139
  return id ?? null;
103
140
  },
104
- sort(id: unknown, order?: unknown): unknown {
105
- const o = String(order ?? "asc").toLowerCase();
106
- asArray(id)?.sort(o.startsWith("desc") ? "desc" : "asc");
141
+ sort(id: unknown, order?: unknown, sortField?: unknown): unknown {
142
+ const parsed = parseSortArgs(order, sortField);
143
+ asArray(id)?.sort(parsed.order, parsed.field);
107
144
  return id ?? null;
108
145
  },
109
146
  concat(id: unknown, other?: unknown): PineArray | null {
@@ -117,10 +154,10 @@ export const compileArray = {
117
154
  return asArray(id)?.slice(n(from, 0), to == null ? undefined : n(to, 0)) ?? null;
118
155
  },
119
156
  indexof(id: unknown, value?: unknown): number | null {
120
- return asArray(id)?.indexof(cell(value)) ?? null;
157
+ return asArray(id)?.indexof(store(value)) ?? null;
121
158
  },
122
159
  lastindexof(id: unknown, value?: unknown): number | null {
123
- return asArray(id)?.lastIndexOf(cell(value)) ?? null;
160
+ return asArray(id)?.lastIndexOf(store(value)) ?? null;
124
161
  },
125
162
  avg(id: unknown): number | null {
126
163
  return asArray(id)?.avg() ?? null;
@@ -174,17 +211,18 @@ export const compileArray = {
174
211
  percentrank(id: unknown, value?: unknown): number | null {
175
212
  return asArray(id)?.percentrank(cell(value)) ?? null;
176
213
  },
177
- binary_search(id: unknown, value?: unknown): number | null {
178
- return asArray(id)?.binarySearch(cell(value)) ?? null;
214
+ binary_search(id: unknown, value?: unknown, sortField?: unknown): number | null {
215
+ return asArray(id)?.binarySearch(store(value), sortField) ?? null;
179
216
  },
180
- binary_search_leftmost(id: unknown, value?: unknown): number | null {
181
- return asArray(id)?.binarySearchLeftmost(cell(value)) ?? null;
217
+ binary_search_leftmost(id: unknown, value?: unknown, sortField?: unknown): number | null {
218
+ return asArray(id)?.binarySearchLeftmost(store(value), sortField) ?? null;
182
219
  },
183
- binary_search_rightmost(id: unknown, value?: unknown): number | null {
184
- return asArray(id)?.binarySearchRightmost(cell(value)) ?? null;
220
+ binary_search_rightmost(id: unknown, value?: unknown, sortField?: unknown): number | null {
221
+ return asArray(id)?.binarySearchRightmost(store(value), sortField) ?? null;
185
222
  },
186
- sort_indices(id: unknown, order?: unknown): PineArray | null {
187
- const idx = asArray(id)?.sortIndices(sortOrder(order));
223
+ sort_indices(id: unknown, order?: unknown, sortField?: unknown): PineArray | null {
224
+ const parsed = parseSortArgs(order, sortField);
225
+ const idx = asArray(id)?.sortIndices(parsed.order, parsed.field);
188
226
  return wrapCells(idx);
189
227
  },
190
228
  };
@@ -232,13 +270,13 @@ export const compileMap = {
232
270
 
233
271
  export const compileMatrix = {
234
272
  new(rows?: unknown, cols?: unknown, initial?: unknown): PineMatrix {
235
- return new PineMatrix(n(rows, 0), n(cols, 0), cell(initial));
273
+ return new PineMatrix(n(rows, 0), n(cols, 0), store(initial));
236
274
  },
237
- get(id: unknown, row?: unknown, col?: unknown): number | null {
275
+ get(id: unknown, row?: unknown, col?: unknown): unknown {
238
276
  return asMatrix(id)?.get(n(row, 0), n(col, 0)) ?? null;
239
277
  },
240
278
  set(id: unknown, row?: unknown, col?: unknown, value?: unknown): unknown {
241
- asMatrix(id)?.set(n(row, 0), n(col, 0), cell(value));
279
+ asMatrix(id)?.set(n(row, 0), n(col, 0), store(value));
242
280
  return id ?? null;
243
281
  },
244
282
  rows(id: unknown): number {
@@ -248,7 +286,17 @@ export const compileMatrix = {
248
286
  return asMatrix(id)?.columns() ?? 0;
249
287
  },
250
288
  fill(id: unknown, value?: unknown): unknown {
251
- asMatrix(id)?.fill(cell(value));
289
+ asMatrix(id)?.fill(store(value));
290
+ return id ?? null;
291
+ },
292
+ add_row(id: unknown, index?: unknown, array?: unknown): unknown {
293
+ const idx = naNum(index);
294
+ asMatrix(id)?.addRow(idx ?? undefined, storedArrayValues(array));
295
+ return id ?? null;
296
+ },
297
+ add_col(id: unknown, index?: unknown, array?: unknown): unknown {
298
+ const idx = naNum(index);
299
+ asMatrix(id)?.addCol(idx ?? undefined, storedArrayValues(array));
252
300
  return id ?? null;
253
301
  },
254
302
  transpose(id: unknown): PineMatrix | null {
@@ -326,14 +374,123 @@ export const compileMatrix = {
326
374
  asMatrix(id)?.reverse();
327
375
  return id ?? null;
328
376
  },
329
- sort(id: unknown, column?: unknown, order?: unknown): unknown {
330
- asMatrix(id)?.sort(n(column, 0), sortOrder(order));
377
+ sort(id: unknown, column?: unknown, order?: unknown, sortField?: unknown): unknown {
378
+ asMatrix(id)?.sort(n(column, 0), sortOrder(order), sortField);
331
379
  return id ?? null;
332
380
  },
381
+ sort_indices(id: unknown, column?: unknown, order?: unknown, sortField?: unknown): PineArray | null {
382
+ const m = asMatrix(id);
383
+ if (m == null) return null;
384
+ return wrapCells(m.sortIndices(n(column, 0), sortOrder(order), sortField));
385
+ },
333
386
  eigenvalues(id: unknown): PineArray | null {
334
387
  return wrapCells(asMatrix(id)?.eigenvalues());
335
388
  },
336
389
  eigenvectors(id: unknown): PineMatrix | null {
337
390
  return asMatrix(id)?.eigenvectors() ?? null;
338
391
  },
392
+ sum_row(id: unknown, index?: unknown): number | null {
393
+ const m = asMatrix(id);
394
+ const i = naNum(index);
395
+ if (m == null || i == null) return null;
396
+ return m.sumRow(i);
397
+ },
398
+ avg_row(id: unknown, index?: unknown): number | null {
399
+ const m = asMatrix(id);
400
+ const i = naNum(index);
401
+ if (m == null || i == null) return null;
402
+ return m.avgRow(i);
403
+ },
404
+ min_row(id: unknown, index?: unknown): number | null {
405
+ const m = asMatrix(id);
406
+ const i = naNum(index);
407
+ if (m == null || i == null) return null;
408
+ return m.minRow(i);
409
+ },
410
+ max_row(id: unknown, index?: unknown): number | null {
411
+ const m = asMatrix(id);
412
+ const i = naNum(index);
413
+ if (m == null || i == null) return null;
414
+ return m.maxRow(i);
415
+ },
416
+ mode_row(id: unknown, index?: unknown): unknown {
417
+ const m = asMatrix(id);
418
+ const i = naNum(index);
419
+ if (m == null || i == null) return null;
420
+ return m.modeRow(i);
421
+ },
422
+ sum_col(id: unknown, index?: unknown): number | null {
423
+ const m = asMatrix(id);
424
+ const i = naNum(index);
425
+ if (m == null || i == null) return null;
426
+ return m.sumCol(i);
427
+ },
428
+ avg_col(id: unknown, index?: unknown): number | null {
429
+ const m = asMatrix(id);
430
+ const i = naNum(index);
431
+ if (m == null || i == null) return null;
432
+ return m.avgCol(i);
433
+ },
434
+ min_col(id: unknown, index?: unknown): number | null {
435
+ const m = asMatrix(id);
436
+ const i = naNum(index);
437
+ if (m == null || i == null) return null;
438
+ return m.minCol(i);
439
+ },
440
+ max_col(id: unknown, index?: unknown): number | null {
441
+ const m = asMatrix(id);
442
+ const i = naNum(index);
443
+ if (m == null || i == null) return null;
444
+ return m.maxCol(i);
445
+ },
446
+ mode_col(id: unknown, index?: unknown): unknown {
447
+ const m = asMatrix(id);
448
+ const i = naNum(index);
449
+ if (m == null || i == null) return null;
450
+ return m.modeCol(i);
451
+ },
452
+ copy_row(id: unknown, index?: unknown): PineArray | null {
453
+ const m = asMatrix(id);
454
+ const i = naNum(index);
455
+ if (m == null || i == null) return null;
456
+ return wrapCells(m.copyRow(i));
457
+ },
458
+ copy_col(id: unknown, index?: unknown): PineArray | null {
459
+ const m = asMatrix(id);
460
+ const i = naNum(index);
461
+ if (m == null || i == null) return null;
462
+ return wrapCells(m.copyCol(i));
463
+ },
464
+ fill_row(id: unknown, index?: unknown, value?: unknown): unknown {
465
+ const i = naNum(index);
466
+ if (i != null) asMatrix(id)?.fillRow(i, store(value));
467
+ return id ?? null;
468
+ },
469
+ fill_col(id: unknown, index?: unknown, value?: unknown): unknown {
470
+ const i = naNum(index);
471
+ if (i != null) asMatrix(id)?.fillCol(i, store(value));
472
+ return id ?? null;
473
+ },
474
+ fill_diagonal(id: unknown, value?: unknown): unknown {
475
+ asMatrix(id)?.fillDiagonal(store(value));
476
+ return id ?? null;
477
+ },
478
+ reverse_rows(id: unknown): unknown {
479
+ asMatrix(id)?.reverseRows();
480
+ return id ?? null;
481
+ },
482
+ reverse_cols(id: unknown): unknown {
483
+ asMatrix(id)?.reverseCols();
484
+ return id ?? null;
485
+ },
486
+ stdev(id: unknown): number | null {
487
+ return asMatrix(id)?.stdev() ?? null;
488
+ },
489
+ variance(id: unknown): number | null {
490
+ return asMatrix(id)?.variance() ?? null;
491
+ },
492
+ mode_all(id: unknown): unknown {
493
+ const m = asMatrix(id);
494
+ return m == null ? null : m.modeAll();
495
+ },
339
496
  };