@alphacharts/indicators 0.1.0 → 0.1.1

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.
@@ -0,0 +1,687 @@
1
+ //#region src/engine/feed.ts
2
+ var e = [
3
+ "open",
4
+ "high",
5
+ "low",
6
+ "close",
7
+ "volume"
8
+ ], t = class {
9
+ graph = new p();
10
+ align = "same";
11
+ spanMs = 0;
12
+ cur = 0;
13
+ get n() {
14
+ return this.graph.n;
15
+ }
16
+ load(t, r, i = "outside series") {
17
+ n(r, i);
18
+ let a = t.time.length;
19
+ for (let n of e) {
20
+ if (!(t[n] instanceof Float64Array)) throw TypeError(`${i}: ${n} must be a Float64Array`);
21
+ if (t[n].length !== a) throw RangeError(`${i}: ${n} has ${t[n].length} rows, time has ${a}`);
22
+ }
23
+ for (let e = 0; e < a; e++) {
24
+ if (!Number.isFinite(t.time[e])) throw RangeError(`${i}: time at row ${e} is not a finite number`);
25
+ if (e > 0 && !(t.time[e] > t.time[e - 1])) throw RangeError(`${i}: times must be strictly increasing (row ${e})`);
26
+ }
27
+ let o = this.graph;
28
+ o.clear(), o.reserve(a), o.time.v.set(t.time);
29
+ for (let n of e) o[n].v.set(t[n]);
30
+ o.n = a, o.run(0, a), this.cur = 0, this.align = r.align, this.spanMs = r.spanMs;
31
+ }
32
+ configure(e, t = "outside series") {
33
+ n(e, t), this.align = e.align, this.spanMs = e.spanMs;
34
+ }
35
+ apply(t, n = "outside series") {
36
+ let r = this.graph, i = r.n;
37
+ if (!Number.isFinite(t.time)) throw RangeError(`${n}: bar time is not a finite number`);
38
+ if (i > 0 && t.time < r.time.v[i - 1]) throw RangeError(`${n}: bar time ${t.time} is earlier than the last bar ${r.time.v[i - 1]}; load the series again instead`);
39
+ let a = i > 0 && t.time === r.time.v[i - 1], o = a ? i - 1 : i;
40
+ a || (r.reserve(i + 1), r.n = i + 1), r.time.v[o] = t.time;
41
+ for (let n of e) r[n].v[o] = t[n];
42
+ return r.run(o, o + 1), a ? "revised" : "appended";
43
+ }
44
+ snapshot() {
45
+ let e = this.graph, t = e.n;
46
+ return {
47
+ time: e.time.v.slice(0, t),
48
+ open: e.open.v.slice(0, t),
49
+ high: e.high.v.slice(0, t),
50
+ low: e.low.v.slice(0, t),
51
+ close: e.close.v.slice(0, t),
52
+ volume: e.volume.v.slice(0, t)
53
+ };
54
+ }
55
+ lookup(e) {
56
+ let t = this.graph.n;
57
+ if (t === 0 || e !== e) return -1;
58
+ let n = this.graph.time.v, r = this.align === "same" ? e : e - this.spanMs, i = this.cur < t ? this.cur : t - 1;
59
+ if (n[i] <= r) for (; i + 1 < t && n[i + 1] <= r;) i++;
60
+ else {
61
+ let e = 0, t = i;
62
+ for (; e < t;) {
63
+ let i = e + t >>> 1;
64
+ n[i] <= r ? e = i + 1 : t = i;
65
+ }
66
+ if (i = e - 1, i < 0) return -1;
67
+ }
68
+ return this.cur = i, this.align === "same" ? n[i] === e ? i : -1 : i;
69
+ }
70
+ value(e, t) {
71
+ return t < 0 ? NaN : this.graph[e].v[t];
72
+ }
73
+ };
74
+ function n(e, t) {
75
+ if (e.align !== "same" && e.align !== "closed") throw RangeError(`${t}: align must be "same" or "closed", got ${String(e.align)}`);
76
+ if (e.align === "closed" && !(Number.isFinite(e.spanMs) && e.spanMs > 0)) throw RangeError(`${t}: a "closed" feed needs spanMs > 0, got ${String(e.spanMs)}`);
77
+ }
78
+ function r(e, t, n) {
79
+ let r = new Float64Array(n.length);
80
+ for (let i = 0; i < n.length; i++) r[i] = e.value(t, e.lookup(n[i]));
81
+ return r;
82
+ }
83
+ function i(e, t, r) {
84
+ n(r, "outside series");
85
+ let i = e.length, a = t.length, o = {
86
+ align: r.align,
87
+ chartBars: i
88
+ };
89
+ if (i === 0 || a === 0) return {
90
+ ...o,
91
+ matched: 0,
92
+ reason: "empty",
93
+ offsetMs: null,
94
+ message: i === 0 ? "The chart has no bars." : "The outside series has no bars."
95
+ };
96
+ let s = 0, c = 0;
97
+ for (let n = 0; n < i; n++) {
98
+ let i = e[n];
99
+ if (r.align === "same") {
100
+ for (; c < a && t[c] < i;) c++;
101
+ c < a && t[c] === i && s++;
102
+ } else {
103
+ let e = i - r.spanMs;
104
+ for (; c < a && t[c] <= e;) c++;
105
+ c > 0 && s++;
106
+ }
107
+ }
108
+ if (s === i) return {
109
+ ...o,
110
+ matched: s,
111
+ reason: "complete",
112
+ offsetMs: null,
113
+ message: "Every chart bar sees a bar of the outside series."
114
+ };
115
+ if (s > 0) return {
116
+ ...o,
117
+ matched: s,
118
+ reason: "partial",
119
+ offsetMs: null,
120
+ message: `${i - s} of ${i} chart bars have no bar of the outside series and are blank (a missing bar is never filled).`
121
+ };
122
+ if (r.align === "closed") return {
123
+ ...o,
124
+ matched: s,
125
+ reason: "no-finished-bar",
126
+ offsetMs: null,
127
+ message: "No bar of the outside series has finished by any chart bar, so every value is blank."
128
+ };
129
+ let l = (t[0] - e[0]) % r.spanMs;
130
+ l > r.spanMs / 2 ? l -= r.spanMs : l <= -r.spanMs / 2 && (l += r.spanMs);
131
+ let u = Math.round(Math.abs(l) / 6e4), d = l === 0 ? "its bars never fall at the same time as the chart's (the two do not trade at the same times)" : `its bars open ${u} minute${u === 1 ? "" : "s"} ${l > 0 ? "after" : "before"} the chart's`;
132
+ return {
133
+ ...o,
134
+ matched: s,
135
+ reason: "different-clock",
136
+ offsetMs: l,
137
+ message: `No chart bar has a bar of the outside series at exactly its time, so every value is blank: ${d}. A series on the chart's own timeframe joins only at equal times; read a longer timeframe (for example 1d) or a series on the same clock.`
138
+ };
139
+ }
140
+ //#endregion
141
+ //#region src/engine/kernels.ts
142
+ var a = null;
143
+ function o(e) {
144
+ a = e;
145
+ }
146
+ function s() {
147
+ return a;
148
+ }
149
+ function c(e, t, n) {
150
+ if (!a || t !== 0 || n < 4096) return !1;
151
+ for (let t = 0; t < n; t++) if (e[t] !== e[t]) return !1;
152
+ return !0;
153
+ }
154
+ //#endregion
155
+ //#region src/engine/graph.ts
156
+ var l = class {
157
+ v;
158
+ constructor(e) {
159
+ this.v = new Float64Array(e).fill(NaN);
160
+ }
161
+ }, u = class extends l {
162
+ run = () => {};
163
+ }, d = [
164
+ "close",
165
+ "open",
166
+ "high",
167
+ "low",
168
+ "hl2",
169
+ "hlc3",
170
+ "ohlc4",
171
+ "hlcc4"
172
+ ], f = NaN, p = class {
173
+ n = 0;
174
+ cap = 0;
175
+ cols = [];
176
+ nodes = [];
177
+ time;
178
+ open;
179
+ high;
180
+ low;
181
+ close;
182
+ volume;
183
+ sources = /* @__PURE__ */ new Map();
184
+ feeds = /* @__PURE__ */ new Map();
185
+ constructor(e = 0) {
186
+ this.cap = e, this.time = this.col(), this.open = this.col(), this.high = this.col(), this.low = this.col(), this.close = this.col(), this.volume = this.col();
187
+ }
188
+ col() {
189
+ let e = new l(this.cap);
190
+ return this.cols.push(e), e;
191
+ }
192
+ reserve(e) {
193
+ if (e <= this.cap) return;
194
+ let t = Math.max(e, Math.ceil(this.cap * 1.5), 256);
195
+ for (let e of this.cols) {
196
+ let n = new Float64Array(t).fill(f);
197
+ n.set(e.v.subarray(0, Math.min(this.n, e.v.length))), e.v = n;
198
+ }
199
+ this.cap = t;
200
+ }
201
+ run(e, t) {
202
+ if (t > this.cap) throw RangeError(`graph.run: ${t} bars exceed the reserved ${this.cap}`);
203
+ for (let n of this.nodes) n.run(e, t);
204
+ }
205
+ clear() {
206
+ for (let e of this.cols) e.v.fill(f, 0, this.n);
207
+ this.n = 0;
208
+ }
209
+ adopt(e, t) {
210
+ if (e.length !== this.cols.length) throw RangeError(`graph.adopt: ${e.length} columns, expected ${this.cols.length}`);
211
+ this.cols.forEach((t, n) => t.v = e[n]), this.cap = e[0]?.length ?? 0, this.n = t;
212
+ }
213
+ node(e) {
214
+ let t = new u(this.cap);
215
+ return t.run = (n, r) => e(t, n, r), this.cols.push(t), this.nodes.push(t), t;
216
+ }
217
+ calc(e) {
218
+ return this.node((t, n, r) => {
219
+ let i = t.v;
220
+ for (let t = n; t < r; t++) i[t] = e(t);
221
+ });
222
+ }
223
+ val(e) {
224
+ return typeof e == "number" ? () => e : (t) => e.v[t];
225
+ }
226
+ src(e) {
227
+ let t = this.sources.get(e);
228
+ if (t) return t;
229
+ let { open: n, high: r, low: i, close: a } = this, o;
230
+ switch (e) {
231
+ case "close":
232
+ o = this.map(a, (e) => e);
233
+ break;
234
+ case "open":
235
+ o = this.map(n, (e) => e);
236
+ break;
237
+ case "high":
238
+ o = this.map(r, (e) => e);
239
+ break;
240
+ case "low":
241
+ o = this.map(i, (e) => e);
242
+ break;
243
+ case "hl2":
244
+ o = this.node((e, t, n) => {
245
+ let a = r.v, o = i.v, s = e.v;
246
+ for (let e = t; e < n; e++) s[e] = (a[e] + o[e]) / 2;
247
+ });
248
+ break;
249
+ case "hlc3":
250
+ o = this.node((e, t, n) => {
251
+ let o = r.v, s = i.v, c = a.v, l = e.v;
252
+ for (let e = t; e < n; e++) l[e] = (o[e] + s[e] + c[e]) / 3;
253
+ });
254
+ break;
255
+ case "ohlc4":
256
+ o = this.node((e, t, o) => {
257
+ let s = n.v, c = r.v, l = i.v, u = a.v, d = e.v;
258
+ for (let e = t; e < o; e++) d[e] = (s[e] + c[e] + l[e] + u[e]) / 4;
259
+ });
260
+ break;
261
+ case "hlcc4":
262
+ o = this.node((e, t, n) => {
263
+ let o = r.v, s = i.v, c = a.v, l = e.v;
264
+ for (let e = t; e < n; e++) l[e] = (o[e] + s[e] + 2 * c[e]) / 4;
265
+ });
266
+ break;
267
+ default: throw RangeError(`unknown source "${String(e)}"`);
268
+ }
269
+ return this.sources.set(e, o), o;
270
+ }
271
+ feed(e) {
272
+ let n = this.feeds.get(e);
273
+ return n || this.feeds.set(e, n = new t()), n;
274
+ }
275
+ external(e, t) {
276
+ return this.joined(e, t);
277
+ }
278
+ joined(e, t) {
279
+ let n = this.feed(e), r = this.time;
280
+ return this.node((i, a, o) => {
281
+ let s = r.v, c = i.v, l = this.feeds.get(e) ?? n, u = typeof t == "string" ? l.graph[t] : t;
282
+ for (let e = a; e < o; e++) {
283
+ let t = l.lookup(s[e]);
284
+ c[e] = t < 0 ? f : u.v[t];
285
+ }
286
+ });
287
+ }
288
+ map(e, t) {
289
+ return this.node((n, r, i) => {
290
+ let a = e.v, o = n.v;
291
+ for (let e = r; e < i; e++) o[e] = t(a[e]);
292
+ });
293
+ }
294
+ map2(e, t, n) {
295
+ let r = this.val(e), i = this.val(t);
296
+ return this.node((e, t, a) => {
297
+ let o = e.v;
298
+ for (let e = t; e < a; e++) o[e] = n(r(e), i(e));
299
+ });
300
+ }
301
+ add(e, t) {
302
+ return this.map2(e, t, (e, t) => e + t);
303
+ }
304
+ sub(e, t) {
305
+ return this.map2(e, t, (e, t) => e - t);
306
+ }
307
+ mul(e, t) {
308
+ return this.map2(e, t, (e, t) => e * t);
309
+ }
310
+ div(e, t) {
311
+ return this.map2(e, t, (e, t) => t === 0 ? f : e / t);
312
+ }
313
+ max2(e, t) {
314
+ return this.map2(e, t, (e, t) => e !== e || t !== t ? f : e > t ? e : t);
315
+ }
316
+ min2(e, t) {
317
+ return this.map2(e, t, (e, t) => e !== e || t !== t ? f : e < t ? e : t);
318
+ }
319
+ abs(e) {
320
+ return this.map(e, Math.abs);
321
+ }
322
+ neg(e) {
323
+ return this.map(e, (e) => -e);
324
+ }
325
+ lag(e, t) {
326
+ return this.node((n, r, i) => {
327
+ let a = e.v, o = n.v;
328
+ for (let e = r; e < i; e++) o[e] = e >= t ? a[e - t] : f;
329
+ });
330
+ }
331
+ change(e, t = 1) {
332
+ return this.node((n, r, i) => {
333
+ let a = e.v, o = n.v;
334
+ for (let e = r; e < i; e++) o[e] = e >= t ? a[e] - a[e - t] : f;
335
+ });
336
+ }
337
+ validRun(e) {
338
+ return this.node((t, n, r) => {
339
+ let i = e.v, a = t.v;
340
+ for (let e = n; e < r; e++) a[e] = i[e] === i[e] ? (e > 0 ? a[e - 1] : 0) + 1 : 0;
341
+ });
342
+ }
343
+ sum(e, t) {
344
+ if (y(t), t === 1) return this.map(e, (e) => e);
345
+ let n = this.validRun(e), r = this.col();
346
+ return this.node((i, a, o) => {
347
+ let l = e.v, u = n.v, d = r.v, p = i.v;
348
+ if (c(l, a, o)) {
349
+ let e = s().sumState(l.subarray(0, o), t);
350
+ p.set(e.sum), d.set(e.state);
351
+ } else for (let e = a; e < o; e++) {
352
+ let n = u[e];
353
+ if (n === 0) {
354
+ d[e] = 0, p[e] = f;
355
+ continue;
356
+ }
357
+ let r = (n > 1 ? d[e - 1] : 0) + l[e];
358
+ n > t && (r -= l[e - t]), d[e] = r, p[e] = n >= t ? r : f;
359
+ }
360
+ });
361
+ }
362
+ sma(e, t) {
363
+ let n = this.sum(e, t);
364
+ return this.map(n, (e) => e / t);
365
+ }
366
+ smooth(e, t, n) {
367
+ y(t);
368
+ let r = this.validRun(e);
369
+ return this.node((i, a, o) => {
370
+ let s = e.v, c = r.v, l = i.v;
371
+ for (let e = a; e < o; e++) {
372
+ let r = c[e];
373
+ if (r === 0) {
374
+ l[e] = f;
375
+ continue;
376
+ }
377
+ let i = e > 0 ? l[e - 1] : f;
378
+ if (i === i) l[e] = i + n * (s[e] - i);
379
+ else if (r >= t) {
380
+ let n = 0;
381
+ for (let r = e - t + 1; r <= e; r++) n += s[r];
382
+ l[e] = n / t;
383
+ } else l[e] = f;
384
+ }
385
+ });
386
+ }
387
+ ema(e, t) {
388
+ return this.smooth(e, t, 2 / (t + 1));
389
+ }
390
+ rma(e, t) {
391
+ return this.smooth(e, t, 1 / t);
392
+ }
393
+ wma(e, t) {
394
+ y(t);
395
+ let n = this.validRun(e), r = this.col(), i = this.col(), a = t * (t + 1) / 2;
396
+ return this.node((o, s, c) => {
397
+ let l = e.v, u = n.v, d = r.v, p = i.v, m = o.v;
398
+ for (let e = s; e < c; e++) {
399
+ let n = u[e];
400
+ if (n === 0) {
401
+ d[e] = 0, p[e] = 0, m[e] = f;
402
+ continue;
403
+ }
404
+ let r = l[e];
405
+ if (n < t) d[e] = (n > 1 ? d[e - 1] : 0) + r, p[e] = (n > 1 ? p[e - 1] : 0) + n * r, m[e] = f;
406
+ else if (n === t) d[e] = (n > 1 ? d[e - 1] : 0) + r, p[e] = (n > 1 ? p[e - 1] : 0) + t * r, m[e] = p[e] / a;
407
+ else {
408
+ let n = d[e - 1];
409
+ p[e] = p[e - 1] - n + t * r, d[e] = n - l[e - t] + r, m[e] = p[e] / a;
410
+ }
411
+ }
412
+ });
413
+ }
414
+ highest(e, t) {
415
+ return this.extreme(e, t, !0, !1);
416
+ }
417
+ lowest(e, t) {
418
+ return this.extreme(e, t, !1, !1);
419
+ }
420
+ highestBars(e, t, n = !1) {
421
+ return this.extreme(e, t, !0, !0, n);
422
+ }
423
+ lowestBars(e, t, n = !1) {
424
+ return this.extreme(e, t, !1, !0, n);
425
+ }
426
+ extreme(e, t, n, r, i = !1) {
427
+ y(t);
428
+ let a = this.validRun(e);
429
+ return this.node((o, l, u) => {
430
+ let d = e.v, p = a.v, m = o.v;
431
+ if (!i && c(d, l, u)) {
432
+ let e = s(), i = d.subarray(0, u);
433
+ m.set(r ? n ? e.highestBars(i, t) : e.lowestBars(i, t) : n ? e.highest(i, t) : e.lowest(i, t));
434
+ } else for (let e = l; e < u; e++) {
435
+ if (p[e] < t) {
436
+ m[e] = f;
437
+ continue;
438
+ }
439
+ let a = d[e], o = 0;
440
+ for (let r = 1; r < t; r++) {
441
+ let t = d[e - r];
442
+ (n ? i ? t >= a : t > a : i ? t <= a : t < a) && (a = t, o = r);
443
+ }
444
+ m[e] = r ? o : a;
445
+ }
446
+ });
447
+ }
448
+ variance(e, t, n = !1) {
449
+ if (y(t), n && t < 2) throw RangeError(`sample variance needs a period of at least 2, got ${t}`);
450
+ let r = this.sma(e, t), i = n ? t / (t - 1) : 1;
451
+ return this.node((a, o, l) => {
452
+ let u = e.v, d = r.v, p = a.v;
453
+ if (c(u, o, l)) {
454
+ if (p.set(s().variance(u.subarray(0, l), t)), n) for (let e = 0; e < l; e++) p[e] = p[e] * i;
455
+ } else for (let e = o; e < l; e++) {
456
+ let r = d[e];
457
+ if (r !== r) {
458
+ p[e] = f;
459
+ continue;
460
+ }
461
+ let i = 0;
462
+ for (let n = e - t + 1; n <= e; n++) {
463
+ let e = u[n] - r;
464
+ i += e * e;
465
+ }
466
+ p[e] = n ? i / (t - 1) : i / t;
467
+ }
468
+ });
469
+ }
470
+ stdev(e, t, n = !1) {
471
+ return this.map(this.variance(e, t, n), Math.sqrt);
472
+ }
473
+ linreg(e, t) {
474
+ if (!Number.isInteger(t) || t < 2) throw RangeError(`linreg: period must be an integer >= 2, got ${t}`);
475
+ let n = this.validRun(e), r = t * (t - 1) / 2, i = t * (t * (t - 1) * (2 * t - 1) / 6) - r * r, a = this.col(), o = this.col();
476
+ return {
477
+ value: this.node((l, u, d) => {
478
+ let p = e.v, m = n.v, h = a.v, g = o.v, _ = l.v;
479
+ if (c(p, u, d)) {
480
+ let e = s().linreg(p.subarray(0, d), t);
481
+ _.set(e.value), h.set(e.slope), g.set(e.intercept);
482
+ } else for (let e = u; e < d; e++) {
483
+ if (m[e] < t) {
484
+ h[e] = f, g[e] = f, _[e] = f;
485
+ continue;
486
+ }
487
+ let n = 0, a = 0;
488
+ for (let r = 0; r < t; r++) {
489
+ let i = p[e - t + 1 + r];
490
+ n += i, a += r * i;
491
+ }
492
+ let o = (t * a - r * n) / i, s = (n - o * r) / t;
493
+ h[e] = o, g[e] = s, _[e] = s + o * (t - 1);
494
+ }
495
+ }),
496
+ slope: this.alias(a),
497
+ intercept: this.alias(o)
498
+ };
499
+ }
500
+ alias(e) {
501
+ return this.node((t, n, r) => {
502
+ let i = e.v, a = t.v;
503
+ for (let e = n; e < r; e++) a[e] = i[e];
504
+ });
505
+ }
506
+ tr() {
507
+ let { high: e, low: t, close: n } = this;
508
+ return this.node((r, i, a) => {
509
+ let o = e.v, s = t.v, c = n.v, l = r.v;
510
+ for (let e = i; e < a; e++) {
511
+ if (e === 0) {
512
+ l[e] = f;
513
+ continue;
514
+ }
515
+ let t = c[e - 1], n = o[e] - s[e], r = Math.abs(o[e] - t), i = Math.abs(s[e] - t);
516
+ l[e] = n > r ? n > i ? n : i : r > i ? r : i;
517
+ }
518
+ });
519
+ }
520
+ trFirst() {
521
+ let { high: e, low: t, close: n } = this;
522
+ return this.node((r, i, a) => {
523
+ let o = e.v, s = t.v, c = n.v, l = r.v;
524
+ for (let e = i; e < a; e++) {
525
+ let t = o[e] - s[e];
526
+ if (e === 0) {
527
+ l[e] = t;
528
+ continue;
529
+ }
530
+ let n = c[e - 1], r = Math.abs(o[e] - n), i = Math.abs(s[e] - n);
531
+ l[e] = t > r ? t > i ? t : i : r > i ? r : i;
532
+ }
533
+ });
534
+ }
535
+ atr(e) {
536
+ return this.rma(this.trFirst(), e);
537
+ }
538
+ barsPerYear(e = 0) {
539
+ let t = this.time, n = e * 6e4, r = this.col();
540
+ return this.node((e, i, a) => {
541
+ let o = t.v, s = r.v, c = e.v;
542
+ for (let e = i; e < a; e++) {
543
+ let t = e > 0 && Math.floor((o[e] + n) / m) === Math.floor((o[e - 1] + n) / m);
544
+ s[e] = t ? s[e - 1] + 1 : 1, c[e] = t ? c[e - 1] : e === 0 ? f : v(o, s, e);
545
+ }
546
+ });
547
+ }
548
+ }, m = 864e5, h = 252, g = .05;
549
+ function _(e) {
550
+ e.sort((e, t) => e - t);
551
+ let t = e.length >> 1;
552
+ return e.length % 2 == 0 ? (e[t - 1] + e[t]) / 2 : e[t];
553
+ }
554
+ function v(e, t, n) {
555
+ let r = [];
556
+ for (let e = n - 1; e >= 0 && r.length < 60; e -= t[e]) r.push(t[e]);
557
+ let i = _(r);
558
+ if (i >= 2) return i * h;
559
+ let a = Math.max(0, n - 120 + 1), o = n - a + 1;
560
+ if (o < 6) return f;
561
+ let s = [];
562
+ for (let t = a + 1; t <= n; t++) e[t] > e[t - 1] && s.push(e[t] - e[t - 1]);
563
+ if (s.length === 0) return f;
564
+ let c = _(s);
565
+ if (c >= m && c < 1.5 * m) {
566
+ let t = [
567
+ 0,
568
+ 0,
569
+ 0,
570
+ 0,
571
+ 0,
572
+ 0,
573
+ 0
574
+ ];
575
+ for (let r = a; r <= n; r++) t[(Math.floor(e[r] / m) % 7 + 7) % 7]++;
576
+ if (Math.min(...t.map((e, n) => e + t[(n + 1) % 7])) <= Math.max(g * o, +(o >= 7))) return h * m / c;
577
+ }
578
+ return 365 * m / c;
579
+ }
580
+ function y(e) {
581
+ if (!Number.isInteger(e) || e < 1) throw RangeError(`period must be a positive integer, got ${e}`);
582
+ }
583
+ //#endregion
584
+ //#region src/define.ts
585
+ var b = (e, t, n = 1, r = 1e4, i = e) => ({
586
+ key: e,
587
+ label: i,
588
+ type: "int",
589
+ default: t,
590
+ min: n,
591
+ max: r,
592
+ step: 1
593
+ }), x = (e, t, n = -1e9, r = 1e9, i = .1, a = e) => ({
594
+ key: e,
595
+ label: a,
596
+ type: "float",
597
+ default: t,
598
+ min: n,
599
+ max: r,
600
+ step: i
601
+ }), S = (e, t, n = e) => ({
602
+ key: e,
603
+ label: n,
604
+ type: "bool",
605
+ default: t
606
+ }), C = (e, t, n, r = e) => ({
607
+ key: e,
608
+ label: r,
609
+ type: "select",
610
+ default: t,
611
+ options: n
612
+ }), w = (e = "close", t = "source") => ({
613
+ key: t,
614
+ label: t,
615
+ type: "source",
616
+ default: e,
617
+ options: d
618
+ }), T = {
619
+ blue: "#2962FF",
620
+ orange: "#FF6D00",
621
+ red: "#F23645",
622
+ green: "#089981",
623
+ purple: "#9C27B0",
624
+ teal: "#00897B",
625
+ yellow: "#FBC02D",
626
+ pink: "#E91E63",
627
+ gray: "#787B86",
628
+ lime: "#8BC34A",
629
+ cyan: "#00BCD4",
630
+ brown: "#795548"
631
+ }, E = (e, t, n = {}) => ({
632
+ kind: "line",
633
+ key: n.key ?? e,
634
+ title: n.title ?? e,
635
+ col: e,
636
+ color: t,
637
+ ...n.width !== void 0 && { width: n.width },
638
+ ...n.style && { style: n.style },
639
+ ...n.offset !== void 0 && { offset: n.offset },
640
+ ...n.connect && { connect: !0 }
641
+ }), D = (e, t, n, r = {}) => ({
642
+ kind: "histogram",
643
+ key: r.key ?? e,
644
+ title: r.title ?? e,
645
+ col: e,
646
+ color: t,
647
+ ...n && { colorDown: n }
648
+ }), O = (e, t, n, r, i, a = e) => ({
649
+ kind: "band",
650
+ key: e,
651
+ title: a,
652
+ upper: t,
653
+ lower: n,
654
+ color: r,
655
+ fill: i
656
+ }), k = (e, t, n, r, i = e) => ({
657
+ kind: "fill",
658
+ key: e,
659
+ title: i,
660
+ a: t,
661
+ b: n,
662
+ color: r
663
+ }), A = (e, t, n = T.gray, r = "dashed") => ({
664
+ kind: "hline",
665
+ key: e,
666
+ title: e,
667
+ value: t,
668
+ color: n,
669
+ style: r
670
+ }), j = (e, t, n, r, i = {}) => ({
671
+ kind: "markers",
672
+ key: i.key ?? e,
673
+ title: i.title ?? e,
674
+ col: e,
675
+ shape: t,
676
+ position: n,
677
+ color: r,
678
+ ...i.offset !== void 0 && { offset: i.offset },
679
+ ...i.text && { text: !0 }
680
+ });
681
+ function M(e) {
682
+ return e;
683
+ }
684
+ //#endregion
685
+ export { r as S, d as _, k as a, t as b, A as c, j as d, C as f, u as g, p as h, M as i, b as l, l as m, O as n, x as o, w as p, S as r, D as s, T as t, E as u, o as v, i as x, e as y };
686
+
687
+ //# sourceMappingURL=define-XUgQMhSl.js.map