@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.
- package/CHANGELOG.md +56 -0
- package/README.md +21 -12
- package/dist/browser.js +89 -84
- package/dist/index.js +21011 -12972
- package/package.json +1 -1
- package/src/ast/builder.ts +235 -12
- package/src/ast/nodes.ts +114 -4
- package/src/ast/unparse.ts +192 -17
- package/src/cli/rich.ts +1 -1
- package/src/generated/PinescriptLexer.interp +5 -1
- package/src/generated/PinescriptLexer.tokens +97 -95
- package/src/generated/PinescriptLexer.ts +512 -502
- package/src/generated/PinescriptParser.interp +8 -1
- package/src/generated/PinescriptParser.tokens +97 -95
- package/src/generated/PinescriptParser.ts +1907 -1287
- package/src/generated/PinescriptParserVisitor.ts +36 -1
- package/src/index.ts +1 -0
- package/src/runtime/array.ts +238 -68
- package/src/runtime/compile/collections.ts +191 -34
- package/src/runtime/compile/draw.ts +609 -19
- package/src/runtime/compile/emit.ts +346 -9
- package/src/runtime/compile/emit_call.ts +737 -44
- package/src/runtime/compile/runtime.ts +82 -2
- package/src/runtime/compile/strategy.ts +339 -6
- package/src/runtime/compile/types.ts +2 -0
- package/src/runtime/drawings.ts +405 -8
- package/src/runtime/interpret.ts +2352 -277
- package/src/runtime/matrix.ts +371 -42
- package/src/runtime/strategy.ts +695 -33
- package/src/runtime/ta.ts +1046 -20
- package/src/runtime/timeframe.ts +199 -0
|
@@ -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<
|
|
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),
|
|
80
|
+
return new PineArray(n(size, 0), store(initial));
|
|
48
81
|
},
|
|
49
|
-
|
|
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),
|
|
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(
|
|
94
|
+
asArray(id)?.push(store(value));
|
|
58
95
|
return id ?? null;
|
|
59
96
|
},
|
|
60
|
-
pop(id: unknown):
|
|
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(
|
|
101
|
+
asArray(id)?.unshift(store(value));
|
|
65
102
|
return id ?? null;
|
|
66
103
|
},
|
|
67
|
-
shift(id: unknown):
|
|
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(
|
|
111
|
+
return asArray(id)?.includes(store(value)) ?? false;
|
|
75
112
|
},
|
|
76
|
-
first(id: unknown):
|
|
113
|
+
first(id: unknown): unknown {
|
|
77
114
|
return asArray(id)?.first() ?? null;
|
|
78
115
|
},
|
|
79
|
-
last(id: unknown):
|
|
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),
|
|
120
|
+
asArray(id)?.insert(n(index, 0), store(value));
|
|
84
121
|
return id ?? null;
|
|
85
122
|
},
|
|
86
|
-
remove(id: unknown, index?: unknown):
|
|
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(
|
|
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
|
|
106
|
-
asArray(id)?.sort(
|
|
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(
|
|
157
|
+
return asArray(id)?.indexof(store(value)) ?? null;
|
|
121
158
|
},
|
|
122
159
|
lastindexof(id: unknown, value?: unknown): number | null {
|
|
123
|
-
return asArray(id)?.lastIndexOf(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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),
|
|
273
|
+
return new PineMatrix(n(rows, 0), n(cols, 0), store(initial));
|
|
236
274
|
},
|
|
237
|
-
get(id: unknown, row?: unknown, col?: unknown):
|
|
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),
|
|
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(
|
|
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
|
};
|