@hoox-sh/pynets 0.2.0 → 0.3.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,65 @@ 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
+ get(id: unknown, index?: unknown): unknown {
50
83
  return asArray(id)?.get(n(index, 0)) ?? null;
51
84
  },
52
85
  set(id: unknown, index?: unknown, value?: unknown): unknown {
53
- asArray(id)?.set(n(index, 0), cell(value));
86
+ asArray(id)?.set(n(index, 0), store(value));
54
87
  return id ?? null;
55
88
  },
56
89
  push(id: unknown, value?: unknown): unknown {
57
- asArray(id)?.push(cell(value));
90
+ asArray(id)?.push(store(value));
58
91
  return id ?? null;
59
92
  },
60
- pop(id: unknown): number | null {
93
+ pop(id: unknown): unknown {
61
94
  return asArray(id)?.pop() ?? null;
62
95
  },
63
96
  unshift(id: unknown, value?: unknown): unknown {
64
- asArray(id)?.unshift(cell(value));
97
+ asArray(id)?.unshift(store(value));
65
98
  return id ?? null;
66
99
  },
67
- shift(id: unknown): number | null {
100
+ shift(id: unknown): unknown {
68
101
  return asArray(id)?.shift() ?? null;
69
102
  },
70
103
  size(id: unknown): number {
71
104
  return asArray(id)?.size() ?? 0;
72
105
  },
73
106
  includes(id: unknown, value?: unknown): boolean {
74
- return asArray(id)?.includes(cell(value)) ?? false;
107
+ return asArray(id)?.includes(store(value)) ?? false;
75
108
  },
76
- first(id: unknown): number | null {
109
+ first(id: unknown): unknown {
77
110
  return asArray(id)?.first() ?? null;
78
111
  },
79
- last(id: unknown): number | null {
112
+ last(id: unknown): unknown {
80
113
  return asArray(id)?.last() ?? null;
81
114
  },
82
115
  insert(id: unknown, index?: unknown, value?: unknown): unknown {
83
- asArray(id)?.insert(n(index, 0), cell(value));
116
+ asArray(id)?.insert(n(index, 0), store(value));
84
117
  return id ?? null;
85
118
  },
86
- remove(id: unknown, index?: unknown): number | null {
119
+ remove(id: unknown, index?: unknown): unknown {
87
120
  return asArray(id)?.remove(n(index, 0)) ?? null;
88
121
  },
89
122
  clear(id: unknown): unknown {
@@ -91,7 +124,7 @@ export const compileArray = {
91
124
  return id ?? null;
92
125
  },
93
126
  fill(id: unknown, value?: unknown): unknown {
94
- asArray(id)?.fill(cell(value));
127
+ asArray(id)?.fill(store(value));
95
128
  return id ?? null;
96
129
  },
97
130
  copy(id: unknown): PineArray | null {
@@ -101,9 +134,9 @@ export const compileArray = {
101
134
  asArray(id)?.reverse();
102
135
  return id ?? null;
103
136
  },
104
- sort(id: unknown, order?: unknown): unknown {
105
- const o = String(order ?? "asc").toLowerCase();
106
- asArray(id)?.sort(o.startsWith("desc") ? "desc" : "asc");
137
+ sort(id: unknown, order?: unknown, sortField?: unknown): unknown {
138
+ const parsed = parseSortArgs(order, sortField);
139
+ asArray(id)?.sort(parsed.order, parsed.field);
107
140
  return id ?? null;
108
141
  },
109
142
  concat(id: unknown, other?: unknown): PineArray | null {
@@ -117,10 +150,10 @@ export const compileArray = {
117
150
  return asArray(id)?.slice(n(from, 0), to == null ? undefined : n(to, 0)) ?? null;
118
151
  },
119
152
  indexof(id: unknown, value?: unknown): number | null {
120
- return asArray(id)?.indexof(cell(value)) ?? null;
153
+ return asArray(id)?.indexof(store(value)) ?? null;
121
154
  },
122
155
  lastindexof(id: unknown, value?: unknown): number | null {
123
- return asArray(id)?.lastIndexOf(cell(value)) ?? null;
156
+ return asArray(id)?.lastIndexOf(store(value)) ?? null;
124
157
  },
125
158
  avg(id: unknown): number | null {
126
159
  return asArray(id)?.avg() ?? null;
@@ -174,17 +207,18 @@ export const compileArray = {
174
207
  percentrank(id: unknown, value?: unknown): number | null {
175
208
  return asArray(id)?.percentrank(cell(value)) ?? null;
176
209
  },
177
- binary_search(id: unknown, value?: unknown): number | null {
178
- return asArray(id)?.binarySearch(cell(value)) ?? null;
210
+ binary_search(id: unknown, value?: unknown, sortField?: unknown): number | null {
211
+ return asArray(id)?.binarySearch(store(value), sortField) ?? null;
179
212
  },
180
- binary_search_leftmost(id: unknown, value?: unknown): number | null {
181
- return asArray(id)?.binarySearchLeftmost(cell(value)) ?? null;
213
+ binary_search_leftmost(id: unknown, value?: unknown, sortField?: unknown): number | null {
214
+ return asArray(id)?.binarySearchLeftmost(store(value), sortField) ?? null;
182
215
  },
183
- binary_search_rightmost(id: unknown, value?: unknown): number | null {
184
- return asArray(id)?.binarySearchRightmost(cell(value)) ?? null;
216
+ binary_search_rightmost(id: unknown, value?: unknown, sortField?: unknown): number | null {
217
+ return asArray(id)?.binarySearchRightmost(store(value), sortField) ?? null;
185
218
  },
186
- sort_indices(id: unknown, order?: unknown): PineArray | null {
187
- const idx = asArray(id)?.sortIndices(sortOrder(order));
219
+ sort_indices(id: unknown, order?: unknown, sortField?: unknown): PineArray | null {
220
+ const parsed = parseSortArgs(order, sortField);
221
+ const idx = asArray(id)?.sortIndices(parsed.order, parsed.field);
188
222
  return wrapCells(idx);
189
223
  },
190
224
  };
@@ -232,13 +266,13 @@ export const compileMap = {
232
266
 
233
267
  export const compileMatrix = {
234
268
  new(rows?: unknown, cols?: unknown, initial?: unknown): PineMatrix {
235
- return new PineMatrix(n(rows, 0), n(cols, 0), cell(initial));
269
+ return new PineMatrix(n(rows, 0), n(cols, 0), store(initial));
236
270
  },
237
- get(id: unknown, row?: unknown, col?: unknown): number | null {
271
+ get(id: unknown, row?: unknown, col?: unknown): unknown {
238
272
  return asMatrix(id)?.get(n(row, 0), n(col, 0)) ?? null;
239
273
  },
240
274
  set(id: unknown, row?: unknown, col?: unknown, value?: unknown): unknown {
241
- asMatrix(id)?.set(n(row, 0), n(col, 0), cell(value));
275
+ asMatrix(id)?.set(n(row, 0), n(col, 0), store(value));
242
276
  return id ?? null;
243
277
  },
244
278
  rows(id: unknown): number {
@@ -248,7 +282,17 @@ export const compileMatrix = {
248
282
  return asMatrix(id)?.columns() ?? 0;
249
283
  },
250
284
  fill(id: unknown, value?: unknown): unknown {
251
- asMatrix(id)?.fill(cell(value));
285
+ asMatrix(id)?.fill(store(value));
286
+ return id ?? null;
287
+ },
288
+ add_row(id: unknown, index?: unknown, array?: unknown): unknown {
289
+ const idx = naNum(index);
290
+ asMatrix(id)?.addRow(idx ?? undefined, storedArrayValues(array));
291
+ return id ?? null;
292
+ },
293
+ add_col(id: unknown, index?: unknown, array?: unknown): unknown {
294
+ const idx = naNum(index);
295
+ asMatrix(id)?.addCol(idx ?? undefined, storedArrayValues(array));
252
296
  return id ?? null;
253
297
  },
254
298
  transpose(id: unknown): PineMatrix | null {
@@ -326,14 +370,123 @@ export const compileMatrix = {
326
370
  asMatrix(id)?.reverse();
327
371
  return id ?? null;
328
372
  },
329
- sort(id: unknown, column?: unknown, order?: unknown): unknown {
330
- asMatrix(id)?.sort(n(column, 0), sortOrder(order));
373
+ sort(id: unknown, column?: unknown, order?: unknown, sortField?: unknown): unknown {
374
+ asMatrix(id)?.sort(n(column, 0), sortOrder(order), sortField);
331
375
  return id ?? null;
332
376
  },
377
+ sort_indices(id: unknown, column?: unknown, order?: unknown, sortField?: unknown): PineArray | null {
378
+ const m = asMatrix(id);
379
+ if (m == null) return null;
380
+ return wrapCells(m.sortIndices(n(column, 0), sortOrder(order), sortField));
381
+ },
333
382
  eigenvalues(id: unknown): PineArray | null {
334
383
  return wrapCells(asMatrix(id)?.eigenvalues());
335
384
  },
336
385
  eigenvectors(id: unknown): PineMatrix | null {
337
386
  return asMatrix(id)?.eigenvectors() ?? null;
338
387
  },
388
+ sum_row(id: unknown, index?: unknown): number | null {
389
+ const m = asMatrix(id);
390
+ const i = naNum(index);
391
+ if (m == null || i == null) return null;
392
+ return m.sumRow(i);
393
+ },
394
+ avg_row(id: unknown, index?: unknown): number | null {
395
+ const m = asMatrix(id);
396
+ const i = naNum(index);
397
+ if (m == null || i == null) return null;
398
+ return m.avgRow(i);
399
+ },
400
+ min_row(id: unknown, index?: unknown): number | null {
401
+ const m = asMatrix(id);
402
+ const i = naNum(index);
403
+ if (m == null || i == null) return null;
404
+ return m.minRow(i);
405
+ },
406
+ max_row(id: unknown, index?: unknown): number | null {
407
+ const m = asMatrix(id);
408
+ const i = naNum(index);
409
+ if (m == null || i == null) return null;
410
+ return m.maxRow(i);
411
+ },
412
+ mode_row(id: unknown, index?: unknown): unknown {
413
+ const m = asMatrix(id);
414
+ const i = naNum(index);
415
+ if (m == null || i == null) return null;
416
+ return m.modeRow(i);
417
+ },
418
+ sum_col(id: unknown, index?: unknown): number | null {
419
+ const m = asMatrix(id);
420
+ const i = naNum(index);
421
+ if (m == null || i == null) return null;
422
+ return m.sumCol(i);
423
+ },
424
+ avg_col(id: unknown, index?: unknown): number | null {
425
+ const m = asMatrix(id);
426
+ const i = naNum(index);
427
+ if (m == null || i == null) return null;
428
+ return m.avgCol(i);
429
+ },
430
+ min_col(id: unknown, index?: unknown): number | null {
431
+ const m = asMatrix(id);
432
+ const i = naNum(index);
433
+ if (m == null || i == null) return null;
434
+ return m.minCol(i);
435
+ },
436
+ max_col(id: unknown, index?: unknown): number | null {
437
+ const m = asMatrix(id);
438
+ const i = naNum(index);
439
+ if (m == null || i == null) return null;
440
+ return m.maxCol(i);
441
+ },
442
+ mode_col(id: unknown, index?: unknown): unknown {
443
+ const m = asMatrix(id);
444
+ const i = naNum(index);
445
+ if (m == null || i == null) return null;
446
+ return m.modeCol(i);
447
+ },
448
+ copy_row(id: unknown, index?: unknown): PineArray | null {
449
+ const m = asMatrix(id);
450
+ const i = naNum(index);
451
+ if (m == null || i == null) return null;
452
+ return wrapCells(m.copyRow(i));
453
+ },
454
+ copy_col(id: unknown, index?: unknown): PineArray | null {
455
+ const m = asMatrix(id);
456
+ const i = naNum(index);
457
+ if (m == null || i == null) return null;
458
+ return wrapCells(m.copyCol(i));
459
+ },
460
+ fill_row(id: unknown, index?: unknown, value?: unknown): unknown {
461
+ const i = naNum(index);
462
+ if (i != null) asMatrix(id)?.fillRow(i, store(value));
463
+ return id ?? null;
464
+ },
465
+ fill_col(id: unknown, index?: unknown, value?: unknown): unknown {
466
+ const i = naNum(index);
467
+ if (i != null) asMatrix(id)?.fillCol(i, store(value));
468
+ return id ?? null;
469
+ },
470
+ fill_diagonal(id: unknown, value?: unknown): unknown {
471
+ asMatrix(id)?.fillDiagonal(store(value));
472
+ return id ?? null;
473
+ },
474
+ reverse_rows(id: unknown): unknown {
475
+ asMatrix(id)?.reverseRows();
476
+ return id ?? null;
477
+ },
478
+ reverse_cols(id: unknown): unknown {
479
+ asMatrix(id)?.reverseCols();
480
+ return id ?? null;
481
+ },
482
+ stdev(id: unknown): number | null {
483
+ return asMatrix(id)?.stdev() ?? null;
484
+ },
485
+ variance(id: unknown): number | null {
486
+ return asMatrix(id)?.variance() ?? null;
487
+ },
488
+ mode_all(id: unknown): unknown {
489
+ const m = asMatrix(id);
490
+ return m == null ? null : m.modeAll();
491
+ },
339
492
  };