@prtcl/plonk 1.1.2 → 1.2.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/dist/index.cjs +110 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +53 -10
- package/dist/index.d.ts +53 -10
- package/dist/index.js +108 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -35,6 +35,7 @@ __export(index_exports, {
|
|
|
35
35
|
SIXTY_FPS: () => SIXTY_FPS,
|
|
36
36
|
Scale: () => Scale,
|
|
37
37
|
Sine: () => Sine,
|
|
38
|
+
Slew: () => Slew,
|
|
38
39
|
TimeFormat: () => TimeFormat,
|
|
39
40
|
Wrap: () => Wrap,
|
|
40
41
|
clamp: () => clamp,
|
|
@@ -50,6 +51,7 @@ __export(index_exports, {
|
|
|
50
51
|
scale: () => scale,
|
|
51
52
|
sigmoid: () => sigmoid,
|
|
52
53
|
sine: () => sine,
|
|
54
|
+
slew: () => slew,
|
|
53
55
|
tanh: () => tanh,
|
|
54
56
|
wait: () => wait,
|
|
55
57
|
wrap: () => wrap
|
|
@@ -273,9 +275,9 @@ var Scale = class _Scale {
|
|
|
273
275
|
__publicField(this, "state");
|
|
274
276
|
this.state = parseInitialState(opts);
|
|
275
277
|
}
|
|
276
|
-
/**
|
|
277
|
-
static scale(
|
|
278
|
-
return new _Scale(opts)
|
|
278
|
+
/** Creates a new Scale instance. Alternative form of `new Scale(opts)`. */
|
|
279
|
+
static scale(opts) {
|
|
280
|
+
return new _Scale(opts);
|
|
279
281
|
}
|
|
280
282
|
/** Updates input and/or output ranges, recomputing the internal ratio. */
|
|
281
283
|
setRanges(opts) {
|
|
@@ -426,9 +428,9 @@ var Fold = class _Fold {
|
|
|
426
428
|
const { min, max } = parseOptions4(opts);
|
|
427
429
|
this.state = { min, max, value: min };
|
|
428
430
|
}
|
|
429
|
-
/**
|
|
430
|
-
static fold(
|
|
431
|
-
return new _Fold(opts)
|
|
431
|
+
/** Creates a new Fold instance. Alternative form of `new Fold(opts)`. */
|
|
432
|
+
static fold(opts) {
|
|
433
|
+
return new _Fold(opts);
|
|
432
434
|
}
|
|
433
435
|
/** Updates the range bounds, folding the current value into the new range. */
|
|
434
436
|
setRange(partialOpts) {
|
|
@@ -545,8 +547,96 @@ var Sine = class _Sine {
|
|
|
545
547
|
};
|
|
546
548
|
var sine = Sine.sine;
|
|
547
549
|
|
|
548
|
-
// src/
|
|
550
|
+
// src/slew.ts
|
|
549
551
|
var parseOptions5 = (opts) => {
|
|
552
|
+
return {
|
|
553
|
+
duration: 1e3,
|
|
554
|
+
value: 0,
|
|
555
|
+
...opts
|
|
556
|
+
};
|
|
557
|
+
};
|
|
558
|
+
var getInitialState3 = (duration, value) => {
|
|
559
|
+
return {
|
|
560
|
+
duration,
|
|
561
|
+
from: value,
|
|
562
|
+
prev: now(),
|
|
563
|
+
to: value,
|
|
564
|
+
totalElapsed: 0,
|
|
565
|
+
value
|
|
566
|
+
};
|
|
567
|
+
};
|
|
568
|
+
var Slew = class _Slew {
|
|
569
|
+
constructor(opts) {
|
|
570
|
+
__publicField(this, "state");
|
|
571
|
+
__publicField(this, "_interpolator");
|
|
572
|
+
const { duration, value } = parseOptions5(opts);
|
|
573
|
+
this.state = getInitialState3(duration, value);
|
|
574
|
+
this._interpolator = new Scale({
|
|
575
|
+
from: {
|
|
576
|
+
min: 0,
|
|
577
|
+
max: duration
|
|
578
|
+
},
|
|
579
|
+
to: {
|
|
580
|
+
min: value,
|
|
581
|
+
max: value
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
/** Creates a new Slew instance. Alternative form of `new Slew(opts)`. */
|
|
586
|
+
static slew(opts) {
|
|
587
|
+
return new _Slew(opts);
|
|
588
|
+
}
|
|
589
|
+
/** Returns true when the current value has reached the target. */
|
|
590
|
+
done() {
|
|
591
|
+
return this.state.from === this.state.to || this.state.duration <= this.state.totalElapsed;
|
|
592
|
+
}
|
|
593
|
+
/** Returns the current value. */
|
|
594
|
+
value() {
|
|
595
|
+
if (this.done()) {
|
|
596
|
+
return this.state.to;
|
|
597
|
+
}
|
|
598
|
+
return this.state.value;
|
|
599
|
+
}
|
|
600
|
+
/** Sets a new target value, beginning a transition from the current position. */
|
|
601
|
+
setValue(to) {
|
|
602
|
+
const from = this.value();
|
|
603
|
+
this.state = {
|
|
604
|
+
...this.state,
|
|
605
|
+
from,
|
|
606
|
+
to,
|
|
607
|
+
prev: now(),
|
|
608
|
+
totalElapsed: 0
|
|
609
|
+
};
|
|
610
|
+
this._interpolator.setRanges({
|
|
611
|
+
to: { min: from, max: to }
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
/** Updates the transition duration in milliseconds. */
|
|
615
|
+
setDuration(duration) {
|
|
616
|
+
this.state.duration = Math.max(duration, 0);
|
|
617
|
+
this._interpolator.setRanges({
|
|
618
|
+
from: { min: 0, max: this.state.duration }
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
/** Advances the processor and returns the current value. */
|
|
622
|
+
next() {
|
|
623
|
+
if (this.done()) {
|
|
624
|
+
return this.value();
|
|
625
|
+
}
|
|
626
|
+
const { prev, totalElapsed: prevTotalElapsed, duration } = this.state;
|
|
627
|
+
const curr = now();
|
|
628
|
+
const totalElapsed = prevTotalElapsed + (curr - prev);
|
|
629
|
+
const value = this._interpolator.scale(clamp(totalElapsed, 0, duration));
|
|
630
|
+
this.state.prev = curr;
|
|
631
|
+
this.state.totalElapsed = totalElapsed;
|
|
632
|
+
this.state.value = value;
|
|
633
|
+
return value;
|
|
634
|
+
}
|
|
635
|
+
};
|
|
636
|
+
var slew = Slew.slew;
|
|
637
|
+
|
|
638
|
+
// src/wrap.ts
|
|
639
|
+
var parseOptions6 = (opts) => {
|
|
550
640
|
return {
|
|
551
641
|
min: 0,
|
|
552
642
|
max: 1,
|
|
@@ -556,12 +646,12 @@ var parseOptions5 = (opts) => {
|
|
|
556
646
|
var Wrap = class _Wrap {
|
|
557
647
|
constructor(opts) {
|
|
558
648
|
__publicField(this, "state");
|
|
559
|
-
const { min, max } =
|
|
649
|
+
const { min, max } = parseOptions6(opts);
|
|
560
650
|
this.state = { min, max, value: min };
|
|
561
651
|
}
|
|
562
|
-
/**
|
|
563
|
-
static wrap(
|
|
564
|
-
return new _Wrap(opts)
|
|
652
|
+
/** Creates a new Wrap instance. Alternative form of `new Wrap(opts)`. */
|
|
653
|
+
static wrap(opts) {
|
|
654
|
+
return new _Wrap(opts);
|
|
565
655
|
}
|
|
566
656
|
/** Updates the range bounds, wrapping the current value into the new range. */
|
|
567
657
|
setRange(partialOpts) {
|
|
@@ -615,7 +705,7 @@ var MS_IN_MINUTE = 60 * MS_IN_SECOND;
|
|
|
615
705
|
var MS_IN_HOUR = MS_IN_MINUTE * 60;
|
|
616
706
|
|
|
617
707
|
// src/metro.ts
|
|
618
|
-
var
|
|
708
|
+
var getInitialState4 = (initialTime) => {
|
|
619
709
|
return {
|
|
620
710
|
initialTime,
|
|
621
711
|
isRunning: false,
|
|
@@ -648,7 +738,7 @@ var processTimerState = (state) => {
|
|
|
648
738
|
totalElapsed: totalElapsed + tickInterval
|
|
649
739
|
};
|
|
650
740
|
};
|
|
651
|
-
var
|
|
741
|
+
var parseOptions7 = (opts) => {
|
|
652
742
|
return {
|
|
653
743
|
time: SIXTY_FPS,
|
|
654
744
|
...opts
|
|
@@ -668,7 +758,7 @@ var Metro = class _Metro {
|
|
|
668
758
|
/** Resets state to initial values. */
|
|
669
759
|
__publicField(this, "reset", () => {
|
|
670
760
|
const { initialTime } = this.state;
|
|
671
|
-
this.state =
|
|
761
|
+
this.state = getInitialState4(initialTime);
|
|
672
762
|
});
|
|
673
763
|
/** Updates the tick interval in milliseconds. */
|
|
674
764
|
__publicField(this, "setTime", (updatedTime = this.state.time) => {
|
|
@@ -703,8 +793,8 @@ var Metro = class _Metro {
|
|
|
703
793
|
};
|
|
704
794
|
tick();
|
|
705
795
|
});
|
|
706
|
-
const { time } =
|
|
707
|
-
this.state =
|
|
796
|
+
const { time } = parseOptions7(opts);
|
|
797
|
+
this.state = getInitialState4(time);
|
|
708
798
|
this._listeners = [callback];
|
|
709
799
|
}
|
|
710
800
|
/** Creates a new Metro instance. Alternative form of `new Metro(callback, opts)`. */
|
|
@@ -789,7 +879,7 @@ function ms(val, format) {
|
|
|
789
879
|
|
|
790
880
|
// src/frames.ts
|
|
791
881
|
var DEFAULT_FPS = 60;
|
|
792
|
-
var
|
|
882
|
+
var parseOptions8 = (opts) => {
|
|
793
883
|
const { fps } = {
|
|
794
884
|
fps: DEFAULT_FPS,
|
|
795
885
|
...opts
|
|
@@ -800,7 +890,7 @@ var parseOptions7 = (opts) => {
|
|
|
800
890
|
};
|
|
801
891
|
var Frames = class _Frames extends Metro {
|
|
802
892
|
constructor(callback, opts) {
|
|
803
|
-
super(() => callback(this),
|
|
893
|
+
super(() => callback(this), parseOptions8(opts));
|
|
804
894
|
/** Updates the target frames per second. */
|
|
805
895
|
__publicField(this, "setFPS", (fps = DEFAULT_FPS) => {
|
|
806
896
|
this.setTime(ms(fps, "fps" /* FPS */));
|
|
@@ -869,6 +959,7 @@ function wait(time) {
|
|
|
869
959
|
SIXTY_FPS,
|
|
870
960
|
Scale,
|
|
871
961
|
Sine,
|
|
962
|
+
Slew,
|
|
872
963
|
TimeFormat,
|
|
873
964
|
Wrap,
|
|
874
965
|
clamp,
|
|
@@ -884,6 +975,7 @@ function wait(time) {
|
|
|
884
975
|
scale,
|
|
885
976
|
sigmoid,
|
|
886
977
|
sine,
|
|
978
|
+
slew,
|
|
887
979
|
tanh,
|
|
888
980
|
wait,
|
|
889
981
|
wrap
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/clamp.ts","../src/rand.ts","../src/drunk.ts","../src/now.ts","../src/scale.ts","../src/env.ts","../src/fold.ts","../src/sine.ts","../src/wrap.ts","../src/constants.ts","../src/metro.ts","../src/ms.ts","../src/frames.ts","../src/expo.ts","../src/sigmoid.ts","../src/tanh.ts","../src/wait.ts"],"sourcesContent":["export { Drunk, type DrunkOptions, type DrunkState, drunk } from './drunk';\nexport { Env, type EnvOptions, type EnvState, env } from './env';\nexport { Fold, type FoldOptions, type FoldState, fold } from './fold';\nexport { Rand, type RandOptions, type RandState, rand } from './rand';\nexport { Scale, type ScaleOptions, type ScaleRange, type ScaleState, scale } from './scale';\nexport { Sine, type SineOptions, type SineState, SINE_PERIOD, sine } from './sine';\nexport { Wrap, type WrapOptions, type WrapState, wrap } from './wrap';\nexport { Frames, type FramesOptions, frames } from './frames';\nexport { Metro, type MetroOptions, type TimerCallback, metro } from './metro';\nexport { clamp } from './clamp';\nexport { expo } from './expo';\nexport { ms, type FPS, TimeFormat } from './ms';\nexport { now } from './now';\nexport { sigmoid } from './sigmoid';\nexport { tanh } from './tanh';\nexport { wait } from './wait';\nexport * from './constants';\n","export function clamp(n: number): number;\nexport function clamp(n: number, max: number): number;\nexport function clamp(n: number, min: number, max: number): number;\n\n/**\n * Constrains an input value to a min...max range.\n * @param n - The value to constrain.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The clamped value.\n */\nexport function clamp(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n return Math.min(Math.max(n, a), b);\n}\n","import { clamp } from './clamp';\n\n/** Options for configuring a Rand generator. */\nexport type RandOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Rand generator's internal state. */\nexport type RandState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: RandOptions): Required<RandOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Random number generator that produces values within a bounded range.\n * @param opts - {@link RandOptions} for configuring the range.\n */\nexport class Rand {\n state: RandState;\n\n /** Returns a single random value. One-off form of `new Rand(opts).value()`. */\n static rand(opts?: RandOptions) {\n return new Rand(opts).value();\n }\n\n constructor(opts?: RandOptions) {\n const { min, max } = parseOptions(opts);\n\n this.state = { max, min, value: 0 };\n this.next();\n }\n\n /** Updates the range bounds, clamping the current value if needed. */\n setRange(partialOpts: RandOptions) {\n const { value = 0 } = this.state;\n const { min, max } = {\n ...this.state,\n ...partialOpts,\n };\n\n this.state = {\n ...this.state,\n max,\n min,\n value: clamp(value, min, max),\n };\n }\n\n /** Returns the current value. */\n value() {\n return this.state.value;\n }\n\n /** Generates a new random value within the range. */\n next() {\n const { min, max } = this.state;\n const updates = Math.random() * (max - min) + min;\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Random number generator that produces values within a bounded range.\n * One-off form of `new Rand(opts).value()`.\n */\nexport const rand = Rand.rand;\n","import { clamp } from './clamp';\nimport { Rand } from './rand';\n\nexport const DEFAULT_DRUNK_STEP = 0.1;\n\n/** Options for configuring a Drunk random walk. */\nexport type DrunkOptions = {\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Initial value. If omitted, a random value within the range is used. */\n startsAt?: number;\n /** Maximum step size as a fraction of the range (0-1). Defaults to 0.1. */\n step?: number;\n};\n\n/** Snapshot of a Drunk walk's internal state. */\nexport type DrunkState = {\n initialValue: number;\n max: number;\n min: number;\n step: number;\n value: number;\n};\n\nexport const parseStepSize = (step?: number): number =>\n typeof step !== 'undefined' ? clamp(step, 0, 1) : DEFAULT_DRUNK_STEP;\n\nexport const parseOptions = (opts?: DrunkOptions): Required<DrunkOptions> => {\n const { step, ...restOpts } = opts || {};\n const parsedStepSize = parseStepSize(step);\n\n return {\n max: 1,\n min: 0,\n startsAt: 0,\n step: parsedStepSize,\n ...restOpts,\n };\n};\n\n/**\n * Stochastic random walk generator that produces values within a bounded range.\n * @param opts - {@link DrunkOptions} for configuring the walk.\n */\nexport class Drunk {\n state: DrunkState;\n protected _initialValue: Rand;\n protected _step: Rand;\n\n /** Creates a new Drunk instance. Alternative form of `new Drunk(opts)`. */\n static drunk(opts?: DrunkOptions) {\n return new Drunk(opts);\n }\n\n constructor(opts?: DrunkOptions) {\n const { min, max, step, startsAt } = parseOptions(opts);\n\n this._initialValue = new Rand({ min, max });\n this._step = new Rand({ min: -1, max: 1 });\n\n const initialValue =\n typeof opts?.startsAt !== 'undefined' ? startsAt : this._initialValue.value();\n\n this.state = {\n initialValue,\n max,\n min,\n step,\n value: initialValue,\n };\n }\n\n /** Updates the walk bounds, clamping the current value if needed. */\n setRange(partialOpts?: Pick<DrunkOptions, 'min' | 'max'>) {\n const { max, min } = {\n min: this.state.min,\n max: this.state.max,\n ...partialOpts,\n };\n\n this._initialValue.setRange({ min, max });\n this.state = {\n ...this.state,\n ...(min !== this.state.min || max !== this.state.max\n ? {\n initialValue: clamp(this._initialValue.value(), min, max),\n max,\n min,\n value: clamp(this.state.value, min, max),\n }\n : {\n max,\n min,\n }),\n };\n }\n\n /** Updates the maximum step size. */\n setStepSize(partialOpts?: Pick<DrunkOptions, 'step'>) {\n const step = parseStepSize(partialOpts?.step);\n\n this.state = {\n ...this.state,\n step,\n };\n }\n\n /** Resets the walk with optional new options. */\n reset(opts?: DrunkOptions) {\n const { min, max, startsAt, step } = parseOptions(opts);\n\n this.setRange({ min, max });\n this.setStepSize({ step });\n\n const initialValue =\n typeof opts?.startsAt !== 'undefined' ? startsAt : this._initialValue.next();\n\n this.state = {\n ...this.state,\n initialValue,\n value: initialValue,\n };\n }\n\n /** Returns the current value. */\n value() {\n return this.state.value;\n }\n\n /** Advances one step and returns the new value. */\n next() {\n const { min, max, step, value } = this.state;\n const updates = clamp(value + max * this._step.next() * step, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Stochastic random walk generator that produces values within a bounded range.\n * Alternative form of `new Drunk(opts)`.\n */\nexport const drunk = Drunk.drunk;\n","type InnerNow = () => number;\n\n/** Resolve the best available clock once at module load. */\nconst innerNow = ((): InnerNow => {\n // Browser or modern Node (>= 16)\n if (typeof performance !== 'undefined' && 'now' in performance) {\n return () => performance.now();\n }\n\n // Older Node — use process.hrtime, offset from first call\n if (typeof process === 'object' && process.toString() === '[object process]') {\n const ts = () => {\n const hr = process.hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n const initialNow = ts();\n return () => (ts() - initialNow) / 1e6;\n }\n\n // Fallback — Date.now with manual offset\n const initialNow = Date.now();\n return () => Date.now() - initialNow;\n})();\n\n/**\n * Cross-environment high-resolution timestamp (performance.now polyfill).\n * @returns Elapsed milliseconds since initialization.\n */\nexport function now(): number {\n return innerNow();\n}\n","import { clamp } from './clamp';\n\n/** A numeric range with min and max bounds. */\nexport type ScaleRange = {\n min?: number;\n max: number;\n};\n\n/** Options for configuring a Scale mapper. */\nexport type ScaleOptions = {\n /** Input range. Defaults to { min: 0, max: 1 }. */\n from?: ScaleRange;\n /** Output range. Defaults to { min: 0, max: 1 }. */\n to?: ScaleRange;\n};\n\n/** Snapshot of a Scale mapper's internal state. */\nexport type ScaleState = {\n /** Input range. */\n from: Required<ScaleRange>;\n /** Precomputed (to.max - to.min) / (from.max - from.min), updated when ranges change. */\n ratio: number;\n /** Output range. */\n to: Required<ScaleRange>;\n /** Last scaled value. */\n value: number;\n};\n\n/** Precompute the scale factor so the hot path avoids a division per call. */\nconst computeRatio = (from: Required<ScaleRange>, to: Required<ScaleRange>) =>\n (to.max - to.min) / (from.max - from.min);\n\n/** Build initial state from options, applying defaults and computing the ratio. */\nexport const parseInitialState = (opts?: ScaleOptions): ScaleState => {\n const initialRange: Pick<ScaleState, 'from' | 'to'> = {\n from: {\n min: 0,\n max: 1,\n ...opts?.from,\n },\n to: {\n min: 0,\n max: 1,\n ...opts?.to,\n },\n };\n\n return {\n ...initialRange,\n ratio: computeRatio(initialRange.from, initialRange.to),\n value: initialRange.to.min,\n };\n};\n\n/** Merge partial range updates into existing state, recomputing the ratio. */\nexport const updateStateFromOptions = (opts: ScaleOptions, prevState: ScaleState): ScaleState => {\n const { from, to } = opts;\n const updatedFrom: Required<ScaleRange> = {\n ...prevState.from,\n ...from,\n };\n const updatedTo: Required<ScaleRange> = {\n ...prevState.to,\n ...to,\n };\n\n return {\n ...prevState,\n from: updatedFrom,\n ratio: computeRatio(updatedFrom, updatedTo),\n to: updatedTo,\n value: clamp(prevState.value, updatedTo.min, updatedTo.max),\n };\n};\n\n/**\n * Linear map of values from one range to another, supports negative values and inversion.\n * @param opts - {@link ScaleOptions} for configuring input and output ranges.\n */\nexport class Scale {\n state: ScaleState;\n\n /** Scales a single value. One-off form of `new Scale(opts).scale(n)`. */\n static scale(n: number, opts?: ScaleOptions) {\n return new Scale(opts).scale(n);\n }\n\n constructor(opts?: ScaleOptions) {\n this.state = parseInitialState(opts);\n }\n\n /** Updates input and/or output ranges, recomputing the internal ratio. */\n setRanges(opts: ScaleOptions) {\n this.state = updateStateFromOptions(opts, this.state);\n }\n\n /** Resets with new range options. */\n reset(opts: ScaleOptions) {\n this.state = parseInitialState(opts);\n }\n\n /** Returns the last scaled value. */\n value() {\n return this.state.value;\n }\n\n /** Maps a value from the input range to the output range. */\n scale(n: number) {\n const { from, to, ratio } = this.state;\n const updates = to.min + (clamp(n, from.min, from.max) - from.min) * ratio;\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Linear map of values from one range to another, supports negative values and inversion.\n * One-off form of `new Scale(opts).scale(n)`.\n */\nexport const scale = Scale.scale;\n","import { now } from './now';\nimport { Scale } from './scale';\n\n/** Snapshot of an Env's internal state. */\nexport type EnvState = {\n duration: number;\n from: number;\n prev: number;\n to: number;\n totalElapsed: number;\n value: number;\n};\n\n/** Options for configuring an Env envelope. */\nexport type EnvOptions = {\n /** Duration of the envelope in milliseconds. */\n duration: number;\n /** Starting value. Defaults to 0. */\n from?: number;\n /** Ending value. Defaults to 1. */\n to?: number;\n};\n\nexport const parseOptions = (opts?: EnvOptions): Required<EnvOptions> => {\n return {\n duration: 0,\n from: 0,\n to: 1,\n ...opts,\n };\n};\n\nconst getInitialState = ({ from, to, duration }: Required<EnvOptions>): EnvState => {\n return {\n duration,\n from,\n prev: now(),\n to,\n totalElapsed: 0,\n value: from,\n };\n};\n\nexport const updateStateFromOptions = (\n opts: EnvOptions | undefined,\n prevState: EnvState\n): EnvState => {\n const { from, to, duration } = {\n ...prevState,\n ...opts,\n };\n\n return {\n ...prevState,\n duration,\n from,\n to,\n totalElapsed: 0,\n };\n};\n\n/**\n * Linear envelope which interpolates between two values over a duration. Useful for audio envelopes, transitions, and animations.\n * @param opts - {@link EnvOptions} for configuring the envelope.\n */\nexport class Env {\n state: EnvState;\n protected _interpolator: Scale;\n\n /** Creates a new Env instance. Alternative form of `new Env(opts)`. */\n static env(opts: EnvOptions) {\n return new Env(opts);\n }\n\n constructor(opts: EnvOptions) {\n const { from, to, duration } = parseOptions(opts);\n\n this.state = getInitialState({ from, to, duration });\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: from,\n max: to,\n },\n });\n }\n\n /** Updates the envelope duration. */\n setDuration(duration: number) {\n const { to, totalElapsed } = this.state;\n\n this.state = {\n ...this.state,\n ...(duration <= totalElapsed\n ? {\n duration,\n value: to,\n }\n : { duration }),\n };\n }\n\n /** Restarts the envelope with optional new options. */\n reset(opts?: EnvOptions) {\n const updates = updateStateFromOptions(opts, this.state);\n\n this.state = {\n ...updates,\n prev: now(),\n value: updates.from,\n };\n this._interpolator.setRanges({\n from: {\n min: 0,\n max: updates.duration,\n },\n to: {\n min: updates.from,\n max: updates.to,\n },\n });\n }\n\n /** Returns true when the envelope has completed. */\n done() {\n return this.state.duration <= this.state.totalElapsed;\n }\n\n /** Returns the current interpolated value. */\n value() {\n const { to, value } = this.state;\n\n if (this.done()) {\n return to;\n }\n\n return value;\n }\n\n /** Advances the envelope and returns the new value. */\n next() {\n if (this.done()) {\n return this.value();\n }\n\n const { prev, totalElapsed: prevTotalElapsed } = this.state;\n\n const curr = now();\n const tickInterval = curr - prev;\n const totalElapsed = prevTotalElapsed + tickInterval;\n const updates = this._interpolator.scale(totalElapsed);\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Linear envelope which interpolates between two values over a duration. Useful for audio envelopes, transitions, and animations.\n * Alternative form of `new Env(opts)`.\n */\nexport const env = Env.env;\n","import { clamp } from './clamp';\n\n/** Options for configuring a Fold transformer. */\nexport type FoldOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Fold transformer's internal state. */\nexport type FoldState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: FoldOptions): Required<FoldOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Folds (reflects) values back and forth within a configured range.\n * @param opts - {@link FoldOptions} for configuring the range.\n */\nexport class Fold {\n state: FoldState;\n\n /** Folds a single value. One-off form of `new Fold(opts).fold(n)`. */\n static fold(n: number, opts?: FoldOptions) {\n return new Fold(opts).fold(n);\n }\n\n constructor(opts?: FoldOptions) {\n const { min, max } = parseOptions(opts);\n this.state = { min, max, value: min };\n }\n\n /** Updates the range bounds, folding the current value into the new range. */\n setRange(partialOpts: FoldOptions) {\n const { min, max } = { ...this.state, ...partialOpts };\n\n this.state = {\n ...this.state,\n min,\n max,\n value: transform(this.state.value, min, max),\n };\n }\n\n /** Returns the last folded value. */\n value() {\n return this.state.value;\n }\n\n /** Folds a value into the configured range and caches the result. */\n fold(n: number) {\n const { min, max } = this.state;\n const updates = transform(n, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Folds (reflects) values back and forth within a configured range.\n * One-off form of `new Fold(opts).fold(n)`.\n */\nexport const fold = Fold.fold;\n\n/**\n * Folds (reflects) a value back and forth within a range.\n * @param n - The input value.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The folded value within [min, max].\n */\nexport function transform(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n const range = hi - lo;\n\n if (range === 0) return lo;\n\n const period = range * 2;\n const offset = n - lo;\n\n // Normalize into one full bounce cycle [0, period)\n const normalized = ((offset % period) + period) % period;\n\n // First half travels forward, second half reflects back\n const value = normalized <= range ? lo + normalized : lo + period - normalized;\n\n return clamp(value, lo, hi);\n}\n","import { clamp } from './clamp';\nimport { now } from './now';\nimport { Scale } from './scale';\n\nexport const SINE_PERIOD = Math.PI * 2 - 0.0001;\n\n/** Options for configuring a Sine oscillator. */\nexport type SineOptions = {\n /** Duration of one full cycle in milliseconds. */\n duration: number;\n};\n\n/** Snapshot of a Sine oscillator's internal state. */\nexport type SineState = {\n cycle: number;\n duration: number;\n prev: number;\n totalElapsed: number;\n value: number;\n};\n\nconst getInitialState = (duration: number): SineState => ({\n cycle: 0,\n duration,\n prev: now(),\n totalElapsed: 0,\n value: 0,\n});\n\n/**\n * Time-based sine wave oscillator that outputs values between -1 and 1.\n * @param opts - {@link SineOptions} for configuring the oscillator.\n */\nexport class Sine {\n state: SineState;\n protected _interpolator: Scale;\n\n /** Creates a new Sine instance. Alternative form of `new Sine(opts)`. */\n static sine(opts: SineOptions) {\n return new Sine(opts);\n }\n\n constructor(opts: SineOptions) {\n const { duration } = opts;\n\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: 0,\n max: SINE_PERIOD,\n },\n });\n this.state = getInitialState(duration);\n }\n\n /** Updates the cycle duration. */\n setDuration(duration: number) {\n this.state = {\n ...this.state,\n duration,\n };\n }\n\n /** Resets the oscillator with optional new options. */\n reset(opts?: SineOptions) {\n const { duration } = {\n ...this.state,\n ...opts,\n };\n\n this.state = getInitialState(duration);\n }\n\n /** Returns the current oscillator value. */\n value() {\n return this.state.value;\n }\n\n /** Advances the oscillator and returns the new value. */\n next() {\n const { cycle, duration, prev, totalElapsed: prevTotalElapsed } = this.state;\n const curr = now();\n const tickInterval = curr - prev;\n const totalElapsed = prevTotalElapsed + tickInterval;\n\n const updates = clamp(Math.sin(this._interpolator.scale(totalElapsed)), -1, 1);\n\n if (cycle >= duration) {\n this.state.cycle = 0;\n } else {\n this.state.cycle = cycle + tickInterval;\n }\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Time-based sine wave oscillator that outputs values between -1 and 1.\n * Alternative form of `new Sine(opts)`.\n */\nexport const sine = Sine.sine;\n","/** Options for configuring a Wrap transformer. */\nexport type WrapOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Wrap transformer's internal state. */\nexport type WrapState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: WrapOptions): Required<WrapOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Wraps values around a configured range using modular arithmetic.\n * @param opts - {@link WrapOptions} for configuring the range.\n */\nexport class Wrap {\n state: WrapState;\n\n /** Wraps a single value. One-off form of `new Wrap(opts).wrap(n)`. */\n static wrap(n: number, opts?: WrapOptions) {\n return new Wrap(opts).wrap(n);\n }\n\n constructor(opts?: WrapOptions) {\n const { min, max } = parseOptions(opts);\n\n this.state = { min, max, value: min };\n }\n\n /** Updates the range bounds, wrapping the current value into the new range. */\n setRange(partialOpts: WrapOptions) {\n const { min, max } = {\n ...this.state,\n ...partialOpts,\n };\n\n this.state = {\n ...this.state,\n min,\n max,\n value: transform(this.state.value, min, max),\n };\n }\n\n /** Returns the last wrapped value. */\n value() {\n return this.state.value;\n }\n\n /** Wraps a value into the configured range and caches the result. */\n wrap(n: number) {\n const { min, max } = this.state;\n const updates = transform(n, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Wraps values around a configured range using modular arithmetic.\n * One-off form of `new Wrap(opts).wrap(n)`.\n */\nexport const wrap = Wrap.wrap;\n\n/**\n * Wraps a value around a range using modular arithmetic.\n * @param n - The input value.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The wrapped value within the range.\n */\nexport function transform(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n const lo = Math.min(a, b);\n const range = Math.max(a, b) - lo;\n\n if (range === 0) return lo;\n\n const offset = n - lo;\n\n return lo + (((offset % range) + range) % range);\n}\n","export const SIXTY_FPS = 1000 / 60;\nexport const MS_IN_SECOND = 1000;\nexport const MS_IN_MINUTE = 60 * MS_IN_SECOND;\nexport const MS_IN_HOUR = MS_IN_MINUTE * 60;\n","import { SIXTY_FPS } from './constants';\nimport { now } from './now';\n\n/** Snapshot of a running timer's internal state. */\nexport type TimerState = {\n initialTime: number;\n isRunning: boolean;\n iterations: number;\n prev: number;\n tickInterval: number;\n time: number;\n totalElapsed: number;\n};\n\nexport const getInitialState = (initialTime: number): TimerState => {\n return {\n initialTime,\n isRunning: false,\n iterations: -1,\n prev: 0,\n tickInterval: 0,\n time: initialTime,\n totalElapsed: 0,\n };\n};\n\nexport const processTimerState = (state: TimerState): TimerState | null => {\n const { time, prev, totalElapsed, iterations } = state;\n const curr = now();\n\n if (iterations === -1) {\n return {\n ...state,\n prev: curr,\n iterations: 0,\n };\n }\n\n const tickInterval = curr - prev;\n\n if (tickInterval <= time) {\n return null;\n }\n\n return {\n ...state,\n iterations: iterations + 1,\n prev: curr,\n tickInterval,\n totalElapsed: totalElapsed + tickInterval,\n };\n};\n\n/** Options for configuring a Metro timer. */\nexport type MetroOptions = {\n /** Interval between ticks in milliseconds. Defaults to ~16.67ms (60fps). */\n time?: number;\n};\n\nexport const parseOptions = (opts?: MetroOptions): Required<MetroOptions> => {\n return {\n time: SIXTY_FPS,\n ...opts,\n };\n};\n\n/** Callback invoked on each timer tick with the timer instance. */\nexport type TimerCallback<T extends Metro> = (timer: T) => void;\n\n/**\n * High-resolution recursive timer with variable interval, provides runtime metrics via callback for time-based calculations.\n * @param callback - {@link TimerCallback} called on each tick with the timer instance.\n * @param opts - {@link MetroOptions} for configuring the timer interval.\n */\nexport class Metro {\n state: TimerState;\n protected _listeners: TimerCallback<Metro>[];\n declare protected _timerId: ReturnType<typeof setTimeout> | number;\n\n /** Creates a new Metro instance. Alternative form of `new Metro(callback, opts)`. */\n static metro(callback: TimerCallback<Metro>, opts?: MetroOptions) {\n return new Metro(callback, opts);\n }\n\n constructor(callback: TimerCallback<Metro>, opts?: MetroOptions) {\n const { time } = parseOptions(opts);\n this.state = getInitialState(time);\n this._listeners = [callback];\n }\n\n protected asyncHandler(callback: () => void) {\n this._timerId = setTimeout(callback, SIXTY_FPS);\n }\n\n protected clearAsyncHandler() {\n clearTimeout(this._timerId);\n }\n\n /** Stops the timer and returns total elapsed time in milliseconds. */\n stop = () => {\n const { totalElapsed } = this.state;\n this.reset();\n this.clearAsyncHandler();\n\n return totalElapsed;\n };\n\n /** Resets state to initial values. */\n reset = () => {\n const { initialTime } = this.state;\n this.state = getInitialState(initialTime);\n };\n\n /** Updates the tick interval in milliseconds. */\n setTime = (updatedTime = this.state.time) => {\n const time = Math.max(updatedTime, 0);\n\n this.state = {\n ...this.state,\n time,\n initialTime: time,\n };\n };\n\n /** Starts the timer loop. */\n run = () => {\n if (this.state.isRunning) {\n this.stop();\n }\n\n this.state = {\n ...this.state,\n isRunning: true,\n prev: now(),\n };\n\n const tick = () => {\n const updates = processTimerState(this.state);\n\n if (updates) {\n this.state = updates;\n this._listeners.forEach((listener) => {\n listener(this);\n });\n }\n\n if (this.state.isRunning) {\n this.asyncHandler(tick);\n }\n };\n\n tick();\n };\n}\n\n/**\n * High-resolution recursive timer with variable interval, provides runtime metrics via callback for time-based calculations.\n * Alternative form of `new Metro(callback, opts)`.\n */\nexport const metro = Metro.metro;\n","import { MS_IN_SECOND, MS_IN_MINUTE, MS_IN_HOUR } from './constants';\n\nexport type FPS = 15 | 30 | 60;\n\nexport enum TimeFormat {\n FPS = 'fps',\n HOURS = 'h',\n HZ = 'hz',\n MILLISECONDS = 'ms',\n MINUTES = 'm',\n SECONDS = 's',\n}\n\nexport type AvailableTimeFormats = `${TimeFormat}`;\n\nexport const FORMAT_IDENTIFIERS: AvailableTimeFormats[] = [\n TimeFormat.FPS,\n TimeFormat.HOURS,\n TimeFormat.HZ,\n TimeFormat.MILLISECONDS,\n TimeFormat.MINUTES,\n TimeFormat.SECONDS,\n]\n // Desc length sort so that `ms` matches prior to `m`\n .sort((a, b) => b.length - a.length);\n\ntype FormatGetter = (val: number) => number;\n\nconst FORMATTERS = new Map<AvailableTimeFormats, FormatGetter>([\n [TimeFormat.FPS, (val: number) => MS_IN_SECOND / val],\n [TimeFormat.HOURS, (val: number) => val * MS_IN_HOUR],\n [TimeFormat.HZ, (val: number) => (1 / val) * MS_IN_SECOND],\n [TimeFormat.MILLISECONDS, (val: number) => val],\n [TimeFormat.MINUTES, (val: number) => val * MS_IN_MINUTE],\n [TimeFormat.SECONDS, (val: number) => val * MS_IN_SECOND],\n]);\n\nconst sanitizeStringVal = (val: string) => val.toLocaleLowerCase().trim();\n\nconst parseStringValAndFormat = (val: string) => {\n for (let i = 0; i < FORMAT_IDENTIFIERS.length; i += 1) {\n const format = FORMAT_IDENTIFIERS[i];\n\n if (val.includes(format)) {\n const value = Number(val.replace(' ', '').replace(format, ''));\n\n return {\n format,\n value,\n };\n }\n }\n\n return {\n format: undefined,\n value: undefined,\n };\n};\n\nexport function ms(val: string | null | undefined): number | undefined;\nexport function ms(\n val: string | number | null | undefined,\n format?: AvailableTimeFormats | TimeFormat\n): number | undefined;\n\n/**\n * Converts time format strings or numeric values to their corresponding value in milliseconds.\n * @param val - A string like `'60fps'`, `'2s'`, or a numeric value.\n * @param format - Explicit time format when `val` is a number.\n * @returns Milliseconds, or undefined if the input is invalid.\n */\nexport function ms(\n val: string | number | null | undefined,\n format?: AvailableTimeFormats | TimeFormat\n): number | undefined {\n let parsedValue: number | null | undefined = null;\n let parsedFormat: AvailableTimeFormats = format || TimeFormat.MILLISECONDS;\n\n if (typeof val === 'string') {\n const parsed = parseStringValAndFormat(sanitizeStringVal(val));\n\n if (typeof parsed.value !== 'undefined') {\n parsedValue = parsed.value;\n }\n\n if (parsed.format) {\n parsedFormat = parsed.format;\n }\n } else {\n parsedValue = val;\n }\n\n if (typeof parsedValue === 'undefined' || parsedValue === null || Number.isNaN(parsedValue)) {\n return undefined;\n }\n\n const formatter = FORMATTERS.get(parsedFormat);\n\n if (!formatter) {\n return undefined;\n }\n\n return formatter(parsedValue);\n}\n","import { Metro, type TimerCallback, type MetroOptions } from './metro';\nimport { ms, TimeFormat, type FPS } from './ms';\n\n/** Options for configuring a Frames timer. */\nexport type FramesOptions = {\n /** Target frames per second (15, 30, or 60). Defaults to 60. */\n fps: FPS;\n};\n\nexport const DEFAULT_FPS: FPS = 60;\n\nexport const parseOptions = (opts?: FramesOptions): MetroOptions => {\n const { fps } = {\n fps: DEFAULT_FPS,\n ...opts,\n };\n\n return {\n time: ms(fps, TimeFormat.FPS),\n };\n};\n\n/**\n * Animation-loop timer that uses requestAnimationFrame when available.\n * @param callback - {@link TimerCallback} called on each frame tick.\n * @param opts - {@link FramesOptions} for configuring the target frame rate.\n */\nexport class Frames extends Metro {\n declare protected _timerId: ReturnType<typeof requestAnimationFrame>;\n\n /** Creates a new Frames instance. Alternative form of `new Frames(callback, opts)`. */\n static frames(callback: TimerCallback<Frames>, opts?: FramesOptions) {\n return new Frames(callback, opts);\n }\n\n constructor(callback: TimerCallback<Frames>, opts?: FramesOptions) {\n super(() => callback(this), parseOptions(opts));\n }\n\n protected asyncHandler(callback: () => void) {\n if (typeof window === 'undefined' || !('requestAnimationFrame' in window)) {\n super.asyncHandler(callback);\n } else {\n this._timerId = requestAnimationFrame(callback);\n }\n }\n\n protected clearAsyncHandler() {\n if (typeof window === 'undefined' || !('cancelAnimationFrame' in window)) {\n super.clearAsyncHandler();\n } else {\n cancelAnimationFrame(this._timerId);\n }\n }\n\n /** Updates the target frames per second. */\n setFPS = (fps = DEFAULT_FPS) => {\n this.setTime(ms(fps, TimeFormat.FPS));\n };\n}\n\n/**\n * Animation-loop timer that uses requestAnimationFrame when available.\n * Alternative form of `new Frames(callback, opts)`.\n */\nexport const frames = Frames.frames;\n","import { clamp } from './clamp';\n\n/**\n * Scales 0...1 by Euler's number to produce a natural feeling curve.\n * @param n - Input value (clamped to 0-1).\n * @returns The exponentially scaled value.\n */\nexport function expo(n: number): number {\n return Math.pow(clamp(n, 0, 1), Math.E);\n}\n","import { clamp } from './clamp';\n\nfunction logistic(v: number, k: number): number {\n return 1 / (1 + Math.exp(-k * (v - 0.5)));\n}\n\n/**\n * A normalized sigmoid curve which maps 0...1 → 0...1 for use as a transfer function or waveshaper.\n *\n * The steepness parameter `k` controls the shape — higher values produce a\n * more aggressive S-curve, while k = 0 it's linear.\n * @param n - Input value (clamped to 0...1).\n * @param k - Steepness of the curve (default 5).\n * @returns The shaped value.\n */\nexport function sigmoid(n: number, k = 5): number {\n const x = clamp(n, 0, 1);\n if (k === 0) return x;\n\n const f0 = logistic(0, k);\n\n return (logistic(x, k) - f0) / (logistic(1, k) - f0);\n}\n","import { clamp } from './clamp';\n\n/**\n * A normalized tanh curve which maps -1...1 → -1...1 for use as a transfer function or waveshaper.\n *\n * The steepness parameter `k` controls saturation — higher values push the\n * curve toward hard clipping at the edges, while at k = 0 it's linear.\n * @param n - Input value (clamped to -1...1).\n * @param k - Steepness of the curve (default 5).\n * @returns The shaped value.\n */\nexport function tanh(n: number, k = 5): number {\n const x = clamp(n, -1, 1);\n if (k === 0) return x;\n\n return Math.tanh(k * x) / Math.tanh(k);\n}\n","/**\n * Promisified setTimeout.\n * @param time - Delay in milliseconds.\n * @returns A promise that resolves after the delay.\n */\nexport function wait(time: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, time));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACWO,SAAS,MAAM,GAAW,KAAc,KAAc;AAC3D,MAAI,IAAI;AACR,MAAI,IAAI;AAER,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI;AACJ,UAAI;AAAA,IACN,OAAO;AACL,UAAI;AACJ,UAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;AACnC;;;ACTO,IAAM,eAAe,CAAC,SAA8C;AACzE,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,GAAG;AAAA,EACL;AACF;AAMO,IAAM,OAAN,MAAM,MAAK;AAAA,EAQhB,YAAY,MAAoB;AAPhC;AAQE,UAAM,EAAE,KAAK,IAAI,IAAI,aAAa,IAAI;AAEtC,SAAK,QAAQ,EAAE,KAAK,KAAK,OAAO,EAAE;AAClC,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA,EATA,OAAO,KAAK,MAAoB;AAC9B,WAAO,IAAI,MAAK,IAAI,EAAE,MAAM;AAAA,EAC9B;AAAA;AAAA,EAUA,SAAS,aAA0B;AACjC,UAAM,EAAE,QAAQ,EAAE,IAAI,KAAK;AAC3B,UAAM,EAAE,KAAK,IAAI,IAAI;AAAA,MACnB,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAEA,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO,MAAM,OAAO,KAAK,GAAG;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ;AACN,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,OAAO;AACL,UAAM,EAAE,KAAK,IAAI,IAAI,KAAK;AAC1B,UAAM,UAAU,KAAK,OAAO,KAAK,MAAM,OAAO;AAE9C,SAAK,MAAM,QAAQ;AAEnB,WAAO;AAAA,EACT;AACF;AAMO,IAAM,OAAO,KAAK;;;AC7ElB,IAAM,qBAAqB;AAuB3B,IAAM,gBAAgB,CAAC,SAC5B,OAAO,SAAS,cAAc,MAAM,MAAM,GAAG,CAAC,IAAI;AAE7C,IAAMA,gBAAe,CAAC,SAAgD;AAC3E,QAAM,EAAE,MAAM,GAAG,SAAS,IAAI,QAAQ,CAAC;AACvC,QAAM,iBAAiB,cAAc,IAAI;AAEzC,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AAMO,IAAM,QAAN,MAAM,OAAM;AAAA,EAUjB,YAAY,MAAqB;AATjC;AACA,wBAAU;AACV,wBAAU;AAQR,UAAM,EAAE,KAAK,KAAK,MAAM,SAAS,IAAIA,cAAa,IAAI;AAEtD,SAAK,gBAAgB,IAAI,KAAK,EAAE,KAAK,IAAI,CAAC;AAC1C,SAAK,QAAQ,IAAI,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,CAAC;AAEzC,UAAM,eACJ,OAAO,MAAM,aAAa,cAAc,WAAW,KAAK,cAAc,MAAM;AAE9E,SAAK,QAAQ;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EApBA,OAAO,MAAM,MAAqB;AAChC,WAAO,IAAI,OAAM,IAAI;AAAA,EACvB;AAAA;AAAA,EAqBA,SAAS,aAAiD;AACxD,UAAM,EAAE,KAAK,IAAI,IAAI;AAAA,MACnB,KAAK,KAAK,MAAM;AAAA,MAChB,KAAK,KAAK,MAAM;AAAA,MAChB,GAAG;AAAA,IACL;AAEA,SAAK,cAAc,SAAS,EAAE,KAAK,IAAI,CAAC;AACxC,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK;AAAA,MACR,GAAI,QAAQ,KAAK,MAAM,OAAO,QAAQ,KAAK,MAAM,MAC7C;AAAA,QACE,cAAc,MAAM,KAAK,cAAc,MAAM,GAAG,KAAK,GAAG;AAAA,QACxD;AAAA,QACA;AAAA,QACA,OAAO,MAAM,KAAK,MAAM,OAAO,KAAK,GAAG;AAAA,MACzC,IACA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACN;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,aAA0C;AACpD,UAAM,OAAO,cAAc,aAAa,IAAI;AAE5C,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,KAAK,UAAU,KAAK,IAAIA,cAAa,IAAI;AAEtD,SAAK,SAAS,EAAE,KAAK,IAAI,CAAC;AAC1B,SAAK,YAAY,EAAE,KAAK,CAAC;AAEzB,UAAM,eACJ,OAAO,MAAM,aAAa,cAAc,WAAW,KAAK,cAAc,KAAK;AAE7E,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK;AAAA,MACR;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ;AACN,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,OAAO;AACL,UAAM,EAAE,KAAK,KAAK,MAAM,MAAM,IAAI,KAAK;AACvC,UAAM,UAAU,MAAM,QAAQ,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,KAAK,GAAG;AAEtE,SAAK,MAAM,QAAQ;AAEnB,WAAO;AAAA,EACT;AACF;AAMO,IAAM,QAAQ,MAAM;;;AC/I3B,IAAM,YAAY,MAAgB;AAEhC,MAAI,OAAO,gBAAgB,eAAe,SAAS,aAAa;AAC9D,WAAO,MAAM,YAAY,IAAI;AAAA,EAC/B;AAGA,MAAI,OAAO,YAAY,YAAY,QAAQ,SAAS,MAAM,oBAAoB;AAC5E,UAAM,KAAK,MAAM;AACf,YAAM,KAAK,QAAQ,OAAO;AAC1B,aAAO,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC;AAAA,IAC3B;AACA,UAAMC,cAAa,GAAG;AACtB,WAAO,OAAO,GAAG,IAAIA,eAAc;AAAA,EACrC;AAGA,QAAM,aAAa,KAAK,IAAI;AAC5B,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B,GAAG;AAMI,SAAS,MAAc;AAC5B,SAAO,SAAS;AAClB;;;ACDA,IAAM,eAAe,CAAC,MAA4B,QAC/C,GAAG,MAAM,GAAG,QAAQ,KAAK,MAAM,KAAK;AAGhC,IAAM,oBAAoB,CAAC,SAAoC;AACpE,QAAM,eAAgD;AAAA,IACpD,MAAM;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG,MAAM;AAAA,IACX;AAAA,IACA,IAAI;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG,MAAM;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,aAAa,aAAa,MAAM,aAAa,EAAE;AAAA,IACtD,OAAO,aAAa,GAAG;AAAA,EACzB;AACF;AAGO,IAAM,yBAAyB,CAAC,MAAoB,cAAsC;AAC/F,QAAM,EAAE,MAAM,GAAG,IAAI;AACrB,QAAM,cAAoC;AAAA,IACxC,GAAG,UAAU;AAAA,IACb,GAAG;AAAA,EACL;AACA,QAAM,YAAkC;AAAA,IACtC,GAAG,UAAU;AAAA,IACb,GAAG;AAAA,EACL;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM;AAAA,IACN,OAAO,aAAa,aAAa,SAAS;AAAA,IAC1C,IAAI;AAAA,IACJ,OAAO,MAAM,UAAU,OAAO,UAAU,KAAK,UAAU,GAAG;AAAA,EAC5D;AACF;AAMO,IAAM,QAAN,MAAM,OAAM;AAAA,EAQjB,YAAY,MAAqB;AAPjC;AAQE,SAAK,QAAQ,kBAAkB,IAAI;AAAA,EACrC;AAAA;AAAA,EANA,OAAO,MAAM,GAAW,MAAqB;AAC3C,WAAO,IAAI,OAAM,IAAI,EAAE,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA,EAOA,UAAU,MAAoB;AAC5B,SAAK,QAAQ,uBAAuB,MAAM,KAAK,KAAK;AAAA,EACtD;AAAA;AAAA,EAGA,MAAM,MAAoB;AACxB,SAAK,QAAQ,kBAAkB,IAAI;AAAA,EACrC;AAAA;AAAA,EAGA,QAAQ;AACN,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,MAAM,GAAW;AACf,UAAM,EAAE,MAAM,IAAI,MAAM,IAAI,KAAK;AACjC,UAAM,UAAU,GAAG,OAAO,MAAM,GAAG,KAAK,KAAK,KAAK,GAAG,IAAI,KAAK,OAAO;AAErE,SAAK,MAAM,QAAQ;AAEnB,WAAO;AAAA,EACT;AACF;AAMO,IAAM,QAAQ,MAAM;;;AClGpB,IAAMC,gBAAe,CAAC,SAA4C;AACvE,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,GAAG;AAAA,EACL;AACF;AAEA,IAAM,kBAAkB,CAAC,EAAE,MAAM,IAAI,SAAS,MAAsC;AAClF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,IAAI;AAAA,IACV;AAAA,IACA,cAAc;AAAA,IACd,OAAO;AAAA,EACT;AACF;AAEO,IAAMC,0BAAyB,CACpC,MACA,cACa;AACb,QAAM,EAAE,MAAM,IAAI,SAAS,IAAI;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB;AACF;AAMO,IAAM,MAAN,MAAM,KAAI;AAAA,EASf,YAAY,MAAkB;AAR9B;AACA,wBAAU;AAQR,UAAM,EAAE,MAAM,IAAI,SAAS,IAAID,cAAa,IAAI;AAEhD,SAAK,QAAQ,gBAAgB,EAAE,MAAM,IAAI,SAAS,CAAC;AACnD,SAAK,gBAAgB,IAAI,MAAM;AAAA,MAC7B,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,IAAI;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAlBA,OAAO,IAAI,MAAkB;AAC3B,WAAO,IAAI,KAAI,IAAI;AAAA,EACrB;AAAA;AAAA,EAmBA,YAAY,UAAkB;AAC5B,UAAM,EAAE,IAAI,aAAa,IAAI,KAAK;AAElC,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK;AAAA,MACR,GAAI,YAAY,eACZ;AAAA,QACE;AAAA,QACA,OAAO;AAAA,MACT,IACA,EAAE,SAAS;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAmB;AACvB,UAAM,UAAUC,wBAAuB,MAAM,KAAK,KAAK;AAEvD,SAAK,QAAQ;AAAA,MACX,GAAG;AAAA,MACH,MAAM,IAAI;AAAA,MACV,OAAO,QAAQ;AAAA,IACjB;AACA,SAAK,cAAc,UAAU;AAAA,MAC3B,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,KAAK,QAAQ;AAAA,MACf;AAAA,MACA,IAAI;AAAA,QACF,KAAK,QAAQ;AAAA,QACb,KAAK,QAAQ;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO;AACL,WAAO,KAAK,MAAM,YAAY,KAAK,MAAM;AAAA,EAC3C;AAAA;AAAA,EAGA,QAAQ;AACN,UAAM,EAAE,IAAI,MAAM,IAAI,KAAK;AAE3B,QAAI,KAAK,KAAK,GAAG;AACf,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO;AACL,QAAI,KAAK,KAAK,GAAG;AACf,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,UAAM,EAAE,MAAM,cAAc,iBAAiB,IAAI,KAAK;AAEtD,UAAM,OAAO,IAAI;AACjB,UAAM,eAAe,OAAO;AAC5B,UAAM,eAAe,mBAAmB;AACxC,UAAM,UAAU,KAAK,cAAc,MAAM,YAAY;AAErD,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,QAAQ;AAEnB,WAAO;AAAA,EACT;AACF;AAMO,IAAM,MAAM,IAAI;;;ACtJhB,IAAMC,gBAAe,CAAC,SAA8C;AACzE,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,GAAG;AAAA,EACL;AACF;AAMO,IAAM,OAAN,MAAM,MAAK;AAAA,EAQhB,YAAY,MAAoB;AAPhC;AAQE,UAAM,EAAE,KAAK,IAAI,IAAIA,cAAa,IAAI;AACtC,SAAK,QAAQ,EAAE,KAAK,KAAK,OAAO,IAAI;AAAA,EACtC;AAAA;AAAA,EAPA,OAAO,KAAK,GAAW,MAAoB;AACzC,WAAO,IAAI,MAAK,IAAI,EAAE,KAAK,CAAC;AAAA,EAC9B;AAAA;AAAA,EAQA,SAAS,aAA0B;AACjC,UAAM,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,KAAK,OAAO,GAAG,YAAY;AAErD,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO,UAAU,KAAK,MAAM,OAAO,KAAK,GAAG;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ;AACN,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,KAAK,GAAW;AACd,UAAM,EAAE,KAAK,IAAI,IAAI,KAAK;AAC1B,UAAM,UAAU,UAAU,GAAG,KAAK,GAAG;AAErC,SAAK,MAAM,QAAQ;AAEnB,WAAO;AAAA,EACT;AACF;AAMO,IAAM,OAAO,KAAK;AASlB,SAAS,UAAU,GAAW,KAAc,KAAc;AAC/D,MAAI,IAAI;AACR,MAAI,IAAI;AAER,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI;AACJ,UAAI;AAAA,IACN,OAAO;AACL,UAAI;AACJ,UAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI,GAAG,CAAC;AACxB,QAAM,KAAK,KAAK,IAAI,GAAG,CAAC;AACxB,QAAM,QAAQ,KAAK;AAEnB,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,SAAS,QAAQ;AACvB,QAAM,SAAS,IAAI;AAGnB,QAAM,cAAe,SAAS,SAAU,UAAU;AAGlD,QAAM,QAAQ,cAAc,QAAQ,KAAK,aAAa,KAAK,SAAS;AAEpE,SAAO,MAAM,OAAO,IAAI,EAAE;AAC5B;;;AC7GO,IAAM,cAAc,KAAK,KAAK,IAAI;AAiBzC,IAAMC,mBAAkB,CAAC,cAAiC;AAAA,EACxD,OAAO;AAAA,EACP;AAAA,EACA,MAAM,IAAI;AAAA,EACV,cAAc;AAAA,EACd,OAAO;AACT;AAMO,IAAM,OAAN,MAAM,MAAK;AAAA,EAShB,YAAY,MAAmB;AAR/B;AACA,wBAAU;AAQR,UAAM,EAAE,SAAS,IAAI;AAErB,SAAK,gBAAgB,IAAI,MAAM;AAAA,MAC7B,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,IAAI;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF,CAAC;AACD,SAAK,QAAQA,iBAAgB,QAAQ;AAAA,EACvC;AAAA;AAAA,EAlBA,OAAO,KAAK,MAAmB;AAC7B,WAAO,IAAI,MAAK,IAAI;AAAA,EACtB;AAAA;AAAA,EAmBA,YAAY,UAAkB;AAC5B,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAoB;AACxB,UAAM,EAAE,SAAS,IAAI;AAAA,MACnB,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAEA,SAAK,QAAQA,iBAAgB,QAAQ;AAAA,EACvC;AAAA;AAAA,EAGA,QAAQ;AACN,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,OAAO;AACL,UAAM,EAAE,OAAO,UAAU,MAAM,cAAc,iBAAiB,IAAI,KAAK;AACvE,UAAM,OAAO,IAAI;AACjB,UAAM,eAAe,OAAO;AAC5B,UAAM,eAAe,mBAAmB;AAExC,UAAM,UAAU,MAAM,KAAK,IAAI,KAAK,cAAc,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC;AAE7E,QAAI,SAAS,UAAU;AACrB,WAAK,MAAM,QAAQ;AAAA,IACrB,OAAO;AACL,WAAK,MAAM,QAAQ,QAAQ;AAAA,IAC7B;AAEA,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,QAAQ;AAEnB,WAAO;AAAA,EACT;AACF;AAMO,IAAM,OAAO,KAAK;;;AC7FlB,IAAMC,gBAAe,CAAC,SAA8C;AACzE,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,GAAG;AAAA,EACL;AACF;AAMO,IAAM,OAAN,MAAM,MAAK;AAAA,EAQhB,YAAY,MAAoB;AAPhC;AAQE,UAAM,EAAE,KAAK,IAAI,IAAIA,cAAa,IAAI;AAEtC,SAAK,QAAQ,EAAE,KAAK,KAAK,OAAO,IAAI;AAAA,EACtC;AAAA;AAAA,EARA,OAAO,KAAK,GAAW,MAAoB;AACzC,WAAO,IAAI,MAAK,IAAI,EAAE,KAAK,CAAC;AAAA,EAC9B;AAAA;AAAA,EASA,SAAS,aAA0B;AACjC,UAAM,EAAE,KAAK,IAAI,IAAI;AAAA,MACnB,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAEA,SAAK,QAAQ;AAAA,MACX,GAAG,KAAK;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAOC,WAAU,KAAK,MAAM,OAAO,KAAK,GAAG;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ;AACN,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,KAAK,GAAW;AACd,UAAM,EAAE,KAAK,IAAI,IAAI,KAAK;AAC1B,UAAM,UAAUA,WAAU,GAAG,KAAK,GAAG;AAErC,SAAK,MAAM,QAAQ;AAEnB,WAAO;AAAA,EACT;AACF;AAMO,IAAM,OAAO,KAAK;AASlB,SAASA,WAAU,GAAW,KAAc,KAAc;AAC/D,MAAI,IAAI;AACR,MAAI,IAAI;AAER,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI;AACJ,UAAI;AAAA,IACN,OAAO;AACL,UAAI;AACJ,UAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI,GAAG,CAAC;AACxB,QAAM,QAAQ,KAAK,IAAI,GAAG,CAAC,IAAI;AAE/B,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,SAAS,IAAI;AAEnB,SAAO,MAAQ,SAAS,QAAS,SAAS;AAC5C;;;AC3GO,IAAM,YAAY,MAAO;AACzB,IAAM,eAAe;AACrB,IAAM,eAAe,KAAK;AAC1B,IAAM,aAAa,eAAe;;;ACWlC,IAAMC,mBAAkB,CAAC,gBAAoC;AAClE,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AACF;AAEO,IAAM,oBAAoB,CAAC,UAAyC;AACzE,QAAM,EAAE,MAAM,MAAM,cAAc,WAAW,IAAI;AACjD,QAAM,OAAO,IAAI;AAEjB,MAAI,eAAe,IAAI;AACrB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,eAAe,OAAO;AAE5B,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,aAAa;AAAA,IACzB,MAAM;AAAA,IACN;AAAA,IACA,cAAc,eAAe;AAAA,EAC/B;AACF;AAQO,IAAMC,gBAAe,CAAC,SAAgD;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AAUO,IAAM,QAAN,MAAM,OAAM;AAAA,EAUjB,YAAY,UAAgC,MAAqB;AATjE;AACA,wBAAU;AAuBV;AAAA,gCAAO,MAAM;AACX,YAAM,EAAE,aAAa,IAAI,KAAK;AAC9B,WAAK,MAAM;AACX,WAAK,kBAAkB;AAEvB,aAAO;AAAA,IACT;AAGA;AAAA,iCAAQ,MAAM;AACZ,YAAM,EAAE,YAAY,IAAI,KAAK;AAC7B,WAAK,QAAQD,iBAAgB,WAAW;AAAA,IAC1C;AAGA;AAAA,mCAAU,CAAC,cAAc,KAAK,MAAM,SAAS;AAC3C,YAAM,OAAO,KAAK,IAAI,aAAa,CAAC;AAEpC,WAAK,QAAQ;AAAA,QACX,GAAG,KAAK;AAAA,QACR;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAGA;AAAA,+BAAM,MAAM;AACV,UAAI,KAAK,MAAM,WAAW;AACxB,aAAK,KAAK;AAAA,MACZ;AAEA,WAAK,QAAQ;AAAA,QACX,GAAG,KAAK;AAAA,QACR,WAAW;AAAA,QACX,MAAM,IAAI;AAAA,MACZ;AAEA,YAAM,OAAO,MAAM;AACjB,cAAM,UAAU,kBAAkB,KAAK,KAAK;AAE5C,YAAI,SAAS;AACX,eAAK,QAAQ;AACb,eAAK,WAAW,QAAQ,CAAC,aAAa;AACpC,qBAAS,IAAI;AAAA,UACf,CAAC;AAAA,QACH;AAEA,YAAI,KAAK,MAAM,WAAW;AACxB,eAAK,aAAa,IAAI;AAAA,QACxB;AAAA,MACF;AAEA,WAAK;AAAA,IACP;AAnEE,UAAM,EAAE,KAAK,IAAIC,cAAa,IAAI;AAClC,SAAK,QAAQD,iBAAgB,IAAI;AACjC,SAAK,aAAa,CAAC,QAAQ;AAAA,EAC7B;AAAA;AAAA,EARA,OAAO,MAAM,UAAgC,MAAqB;AAChE,WAAO,IAAI,OAAM,UAAU,IAAI;AAAA,EACjC;AAAA,EAQU,aAAa,UAAsB;AAC3C,SAAK,WAAW,WAAW,UAAU,SAAS;AAAA,EAChD;AAAA,EAEU,oBAAoB;AAC5B,iBAAa,KAAK,QAAQ;AAAA,EAC5B;AAyDF;AAMO,IAAM,QAAQ,MAAM;;;AC3JpB,IAAK,aAAL,kBAAKE,gBAAL;AACL,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,WAAQ;AACR,EAAAA,YAAA,QAAK;AACL,EAAAA,YAAA,kBAAe;AACf,EAAAA,YAAA,aAAU;AACV,EAAAA,YAAA,aAAU;AANA,SAAAA;AAAA,GAAA;AAWL,IAAM,qBAA6C;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAEG,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAIrC,IAAM,aAAa,oBAAI,IAAwC;AAAA,EAC7D,CAAC,iBAAgB,CAAC,QAAgB,eAAe,GAAG;AAAA,EACpD,CAAC,iBAAkB,CAAC,QAAgB,MAAM,UAAU;AAAA,EACpD,CAAC,eAAe,CAAC,QAAiB,IAAI,MAAO,YAAY;AAAA,EACzD,CAAC,yBAAyB,CAAC,QAAgB,GAAG;AAAA,EAC9C,CAAC,mBAAoB,CAAC,QAAgB,MAAM,YAAY;AAAA,EACxD,CAAC,mBAAoB,CAAC,QAAgB,MAAM,YAAY;AAC1D,CAAC;AAED,IAAM,oBAAoB,CAAC,QAAgB,IAAI,kBAAkB,EAAE,KAAK;AAExE,IAAM,0BAA0B,CAAC,QAAgB;AAC/C,WAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,KAAK,GAAG;AACrD,UAAM,SAAS,mBAAmB,CAAC;AAEnC,QAAI,IAAI,SAAS,MAAM,GAAG;AACxB,YAAM,QAAQ,OAAO,IAAI,QAAQ,KAAK,EAAE,EAAE,QAAQ,QAAQ,EAAE,CAAC;AAE7D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAcO,SAAS,GACd,KACA,QACoB;AACpB,MAAI,cAAyC;AAC7C,MAAI,eAAqC,UAAU;AAEnD,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAS,wBAAwB,kBAAkB,GAAG,CAAC;AAE7D,QAAI,OAAO,OAAO,UAAU,aAAa;AACvC,oBAAc,OAAO;AAAA,IACvB;AAEA,QAAI,OAAO,QAAQ;AACjB,qBAAe,OAAO;AAAA,IACxB;AAAA,EACF,OAAO;AACL,kBAAc;AAAA,EAChB;AAEA,MAAI,OAAO,gBAAgB,eAAe,gBAAgB,QAAQ,OAAO,MAAM,WAAW,GAAG;AAC3F,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,WAAW,IAAI,YAAY;AAE7C,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,WAAW;AAC9B;;;AC9FO,IAAM,cAAmB;AAEzB,IAAMC,gBAAe,CAAC,SAAuC;AAClE,QAAM,EAAE,IAAI,IAAI;AAAA,IACd,KAAK;AAAA,IACL,GAAG;AAAA,EACL;AAEA,SAAO;AAAA,IACL,MAAM,GAAG,oBAAmB;AAAA,EAC9B;AACF;AAOO,IAAM,SAAN,MAAM,gBAAe,MAAM;AAAA,EAQhC,YAAY,UAAiC,MAAsB;AACjE,UAAM,MAAM,SAAS,IAAI,GAAGA,cAAa,IAAI,CAAC;AAoBhD;AAAA,kCAAS,CAAC,MAAM,gBAAgB;AAC9B,WAAK,QAAQ,GAAG,oBAAmB,CAAC;AAAA,IACtC;AAAA,EArBA;AAAA;AAAA,EANA,OAAO,OAAO,UAAiC,MAAsB;AACnE,WAAO,IAAI,QAAO,UAAU,IAAI;AAAA,EAClC;AAAA,EAMU,aAAa,UAAsB;AAC3C,QAAI,OAAO,WAAW,eAAe,EAAE,2BAA2B,SAAS;AACzE,YAAM,aAAa,QAAQ;AAAA,IAC7B,OAAO;AACL,WAAK,WAAW,sBAAsB,QAAQ;AAAA,IAChD;AAAA,EACF;AAAA,EAEU,oBAAoB;AAC5B,QAAI,OAAO,WAAW,eAAe,EAAE,0BAA0B,SAAS;AACxE,YAAM,kBAAkB;AAAA,IAC1B,OAAO;AACL,2BAAqB,KAAK,QAAQ;AAAA,IACpC;AAAA,EACF;AAMF;AAMO,IAAM,SAAS,OAAO;;;AC1DtB,SAAS,KAAK,GAAmB;AACtC,SAAO,KAAK,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;AACxC;;;ACPA,SAAS,SAAS,GAAW,GAAmB;AAC9C,SAAO,KAAK,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI;AACzC;AAWO,SAAS,QAAQ,GAAW,IAAI,GAAW;AAChD,QAAM,IAAI,MAAM,GAAG,GAAG,CAAC;AACvB,MAAI,MAAM,EAAG,QAAO;AAEpB,QAAM,KAAK,SAAS,GAAG,CAAC;AAExB,UAAQ,SAAS,GAAG,CAAC,IAAI,OAAO,SAAS,GAAG,CAAC,IAAI;AACnD;;;ACXO,SAAS,KAAK,GAAW,IAAI,GAAW;AAC7C,QAAM,IAAI,MAAM,GAAG,IAAI,CAAC;AACxB,MAAI,MAAM,EAAG,QAAO;AAEpB,SAAO,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC;AACvC;;;ACXO,SAAS,KAAK,MAA6B;AAChD,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,IAAI,CAAC;AAC3D;","names":["parseOptions","initialNow","parseOptions","updateStateFromOptions","parseOptions","getInitialState","parseOptions","transform","getInitialState","parseOptions","TimeFormat","parseOptions"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/clamp.ts","../src/rand.ts","../src/drunk.ts","../src/now.ts","../src/scale.ts","../src/env.ts","../src/fold.ts","../src/sine.ts","../src/slew.ts","../src/wrap.ts","../src/constants.ts","../src/metro.ts","../src/ms.ts","../src/frames.ts","../src/expo.ts","../src/sigmoid.ts","../src/tanh.ts","../src/wait.ts"],"sourcesContent":["export { Drunk, type DrunkOptions, type DrunkState, drunk } from './drunk';\nexport { Env, type EnvOptions, type EnvState, env } from './env';\nexport { Fold, type FoldOptions, type FoldState, fold } from './fold';\nexport { Rand, type RandOptions, type RandState, rand } from './rand';\nexport { Scale, type ScaleOptions, type ScaleRange, type ScaleState, scale } from './scale';\nexport { Sine, type SineOptions, type SineState, SINE_PERIOD, sine } from './sine';\nexport { Slew, type SlewOptions, type SlewState, slew } from './slew';\nexport { Wrap, type WrapOptions, type WrapState, wrap } from './wrap';\nexport { Frames, type FramesOptions, frames } from './frames';\nexport { Metro, type MetroOptions, type TimerCallback, type TimerState, metro } from './metro';\nexport { clamp } from './clamp';\nexport { expo } from './expo';\nexport { ms, type FPS, TimeFormat } from './ms';\nexport { now } from './now';\nexport { sigmoid } from './sigmoid';\nexport { tanh } from './tanh';\nexport { wait } from './wait';\nexport * from './constants';\n","export function clamp(n: number): number;\nexport function clamp(n: number, max: number): number;\nexport function clamp(n: number, min: number, max: number): number;\n\n/**\n * Constrains an input value to a min...max range.\n * @param n - The value to constrain.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The clamped value.\n */\nexport function clamp(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n return Math.min(Math.max(n, a), b);\n}\n","import { clamp } from './clamp';\n\n/** Options for configuring a Rand generator. */\nexport type RandOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Rand generator's internal state. */\nexport type RandState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: RandOptions): Required<RandOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Random number generator that produces values within a bounded range.\n * @param opts - {@link RandOptions} for configuring the range.\n */\nexport class Rand {\n state: RandState;\n\n /** Returns a single random value. One-off form of `new Rand(opts).value()`. */\n static rand(opts?: RandOptions) {\n return new Rand(opts).value();\n }\n\n constructor(opts?: RandOptions) {\n const { min, max } = parseOptions(opts);\n\n this.state = { max, min, value: 0 };\n this.next();\n }\n\n /** Updates the range bounds, clamping the current value if needed. */\n setRange(partialOpts: RandOptions) {\n const { value = 0 } = this.state;\n const { min, max } = {\n ...this.state,\n ...partialOpts,\n };\n\n this.state = {\n ...this.state,\n max,\n min,\n value: clamp(value, min, max),\n };\n }\n\n /** Returns the current value. */\n value() {\n return this.state.value;\n }\n\n /** Generates a new random value within the range. */\n next() {\n const { min, max } = this.state;\n const updates = Math.random() * (max - min) + min;\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Random number generator that produces values within a bounded range.\n * One-off form of `new Rand(opts).value()`.\n */\nexport const rand = Rand.rand;\n","import { clamp } from './clamp';\nimport { Rand } from './rand';\n\nexport const DEFAULT_DRUNK_STEP = 0.1;\n\n/** Options for configuring a Drunk random walk. */\nexport type DrunkOptions = {\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Initial value. If omitted, a random value within the range is used. */\n startsAt?: number;\n /** Maximum step size as a fraction of the range (0-1). Defaults to 0.1. */\n step?: number;\n};\n\n/** Snapshot of a Drunk walk's internal state. */\nexport type DrunkState = {\n initialValue: number;\n max: number;\n min: number;\n step: number;\n value: number;\n};\n\nexport const parseStepSize = (step?: number): number =>\n typeof step !== 'undefined' ? clamp(step, 0, 1) : DEFAULT_DRUNK_STEP;\n\nexport const parseOptions = (opts?: DrunkOptions): Required<DrunkOptions> => {\n const { step, ...restOpts } = opts || {};\n const parsedStepSize = parseStepSize(step);\n\n return {\n max: 1,\n min: 0,\n startsAt: 0,\n step: parsedStepSize,\n ...restOpts,\n };\n};\n\n/**\n * Stochastic random walk generator that produces values within a bounded range.\n * @param opts - {@link DrunkOptions} for configuring the walk.\n */\nexport class Drunk {\n state: DrunkState;\n protected _initialValue: Rand;\n protected _step: Rand;\n\n /** Creates a new Drunk instance. Alternative form of `new Drunk(opts)`. */\n static drunk(opts?: DrunkOptions) {\n return new Drunk(opts);\n }\n\n constructor(opts?: DrunkOptions) {\n const { min, max, step, startsAt } = parseOptions(opts);\n\n this._initialValue = new Rand({ min, max });\n this._step = new Rand({ min: -1, max: 1 });\n\n const initialValue =\n typeof opts?.startsAt !== 'undefined' ? startsAt : this._initialValue.value();\n\n this.state = {\n initialValue,\n max,\n min,\n step,\n value: initialValue,\n };\n }\n\n /** Updates the walk bounds, clamping the current value if needed. */\n setRange(partialOpts?: Pick<DrunkOptions, 'min' | 'max'>) {\n const { max, min } = {\n min: this.state.min,\n max: this.state.max,\n ...partialOpts,\n };\n\n this._initialValue.setRange({ min, max });\n this.state = {\n ...this.state,\n ...(min !== this.state.min || max !== this.state.max\n ? {\n initialValue: clamp(this._initialValue.value(), min, max),\n max,\n min,\n value: clamp(this.state.value, min, max),\n }\n : {\n max,\n min,\n }),\n };\n }\n\n /** Updates the maximum step size. */\n setStepSize(partialOpts?: Pick<DrunkOptions, 'step'>) {\n const step = parseStepSize(partialOpts?.step);\n\n this.state = {\n ...this.state,\n step,\n };\n }\n\n /** Resets the walk with optional new options. */\n reset(opts?: DrunkOptions) {\n const { min, max, startsAt, step } = parseOptions(opts);\n\n this.setRange({ min, max });\n this.setStepSize({ step });\n\n const initialValue =\n typeof opts?.startsAt !== 'undefined' ? startsAt : this._initialValue.next();\n\n this.state = {\n ...this.state,\n initialValue,\n value: initialValue,\n };\n }\n\n /** Returns the current value. */\n value() {\n return this.state.value;\n }\n\n /** Advances one step and returns the new value. */\n next() {\n const { min, max, step, value } = this.state;\n const updates = clamp(value + max * this._step.next() * step, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Stochastic random walk generator that produces values within a bounded range.\n * Alternative form of `new Drunk(opts)`.\n */\nexport const drunk = Drunk.drunk;\n","type InnerNow = () => number;\n\n/** Resolve the best available clock once at module load. */\nconst innerNow = ((): InnerNow => {\n // Browser or modern Node (>= 16)\n if (typeof performance !== 'undefined' && 'now' in performance) {\n return () => performance.now();\n }\n\n // Older Node — use process.hrtime, offset from first call\n if (typeof process === 'object' && process.toString() === '[object process]') {\n const ts = () => {\n const hr = process.hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n const initialNow = ts();\n return () => (ts() - initialNow) / 1e6;\n }\n\n // Fallback — Date.now with manual offset\n const initialNow = Date.now();\n return () => Date.now() - initialNow;\n})();\n\n/**\n * Cross-environment high-resolution timestamp (performance.now polyfill).\n * @returns Elapsed milliseconds since initialization.\n */\nexport function now(): number {\n return innerNow();\n}\n","import { clamp } from './clamp';\n\n/** A numeric range with min and max bounds. */\nexport type ScaleRange = {\n min?: number;\n max: number;\n};\n\n/** Options for configuring a Scale mapper. */\nexport type ScaleOptions = {\n /** Input range. Defaults to { min: 0, max: 1 }. */\n from?: ScaleRange;\n /** Output range. Defaults to { min: 0, max: 1 }. */\n to?: ScaleRange;\n};\n\n/** Snapshot of a Scale mapper's internal state. */\nexport type ScaleState = {\n /** Input range. */\n from: Required<ScaleRange>;\n /** Precomputed (to.max - to.min) / (from.max - from.min), updated when ranges change. */\n ratio: number;\n /** Output range. */\n to: Required<ScaleRange>;\n /** Last scaled value. */\n value: number;\n};\n\n/** Precompute the scale factor so the hot path avoids a division per call. */\nconst computeRatio = (from: Required<ScaleRange>, to: Required<ScaleRange>) =>\n (to.max - to.min) / (from.max - from.min);\n\n/** Build initial state from options, applying defaults and computing the ratio. */\nexport const parseInitialState = (opts?: ScaleOptions): ScaleState => {\n const initialRange: Pick<ScaleState, 'from' | 'to'> = {\n from: {\n min: 0,\n max: 1,\n ...opts?.from,\n },\n to: {\n min: 0,\n max: 1,\n ...opts?.to,\n },\n };\n\n return {\n ...initialRange,\n ratio: computeRatio(initialRange.from, initialRange.to),\n value: initialRange.to.min,\n };\n};\n\n/** Merge partial range updates into existing state, recomputing the ratio. */\nexport const updateStateFromOptions = (opts: ScaleOptions, prevState: ScaleState): ScaleState => {\n const { from, to } = opts;\n const updatedFrom: Required<ScaleRange> = {\n ...prevState.from,\n ...from,\n };\n const updatedTo: Required<ScaleRange> = {\n ...prevState.to,\n ...to,\n };\n\n return {\n ...prevState,\n from: updatedFrom,\n ratio: computeRatio(updatedFrom, updatedTo),\n to: updatedTo,\n value: clamp(prevState.value, updatedTo.min, updatedTo.max),\n };\n};\n\n/**\n * Linear map of values from one range to another, supports negative values and inversion.\n * @param opts - {@link ScaleOptions} for configuring input and output ranges.\n */\nexport class Scale {\n state: ScaleState;\n\n /** Creates a new Scale instance. Alternative form of `new Scale(opts)`. */\n static scale(opts?: ScaleOptions) {\n return new Scale(opts);\n }\n\n constructor(opts?: ScaleOptions) {\n this.state = parseInitialState(opts);\n }\n\n /** Updates input and/or output ranges, recomputing the internal ratio. */\n setRanges(opts: ScaleOptions) {\n this.state = updateStateFromOptions(opts, this.state);\n }\n\n /** Resets with new range options. */\n reset(opts: ScaleOptions) {\n this.state = parseInitialState(opts);\n }\n\n /** Returns the last scaled value. */\n value() {\n return this.state.value;\n }\n\n /** Maps a value from the input range to the output range. */\n scale(n: number) {\n const { from, to, ratio } = this.state;\n const updates = to.min + (clamp(n, from.min, from.max) - from.min) * ratio;\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Linear map of values from one range to another, supports negative values and inversion.\n * Alternative form of `new Scale(opts)`.\n */\nexport const scale = Scale.scale;\n","import { now } from './now';\nimport { Scale } from './scale';\n\n/** Snapshot of an Env's internal state. */\nexport type EnvState = {\n duration: number;\n from: number;\n prev: number;\n to: number;\n totalElapsed: number;\n value: number;\n};\n\n/** Options for configuring an Env envelope. */\nexport type EnvOptions = {\n /** Duration of the envelope in milliseconds. */\n duration: number;\n /** Starting value. Defaults to 0. */\n from?: number;\n /** Ending value. Defaults to 1. */\n to?: number;\n};\n\nexport const parseOptions = (opts?: EnvOptions): Required<EnvOptions> => {\n return {\n duration: 0,\n from: 0,\n to: 1,\n ...opts,\n };\n};\n\nconst getInitialState = ({ from, to, duration }: Required<EnvOptions>): EnvState => {\n return {\n duration,\n from,\n prev: now(),\n to,\n totalElapsed: 0,\n value: from,\n };\n};\n\nexport const updateStateFromOptions = (\n opts: EnvOptions | undefined,\n prevState: EnvState\n): EnvState => {\n const { from, to, duration } = {\n ...prevState,\n ...opts,\n };\n\n return {\n ...prevState,\n duration,\n from,\n to,\n totalElapsed: 0,\n };\n};\n\n/**\n * Linear envelope which interpolates between two values over a duration. Useful for audio envelopes, transitions, and animations.\n * @param opts - {@link EnvOptions} for configuring the envelope.\n */\nexport class Env {\n state: EnvState;\n protected _interpolator: Scale;\n\n /** Creates a new Env instance. Alternative form of `new Env(opts)`. */\n static env(opts: EnvOptions) {\n return new Env(opts);\n }\n\n constructor(opts: EnvOptions) {\n const { from, to, duration } = parseOptions(opts);\n\n this.state = getInitialState({ from, to, duration });\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: from,\n max: to,\n },\n });\n }\n\n /** Updates the envelope duration. */\n setDuration(duration: number) {\n const { to, totalElapsed } = this.state;\n\n this.state = {\n ...this.state,\n ...(duration <= totalElapsed\n ? {\n duration,\n value: to,\n }\n : { duration }),\n };\n }\n\n /** Restarts the envelope with optional new options. */\n reset(opts?: EnvOptions) {\n const updates = updateStateFromOptions(opts, this.state);\n\n this.state = {\n ...updates,\n prev: now(),\n value: updates.from,\n };\n this._interpolator.setRanges({\n from: {\n min: 0,\n max: updates.duration,\n },\n to: {\n min: updates.from,\n max: updates.to,\n },\n });\n }\n\n /** Returns true when the envelope has completed. */\n done() {\n return this.state.duration <= this.state.totalElapsed;\n }\n\n /** Returns the current interpolated value. */\n value() {\n const { to, value } = this.state;\n\n if (this.done()) {\n return to;\n }\n\n return value;\n }\n\n /** Advances the envelope and returns the new value. */\n next() {\n if (this.done()) {\n return this.value();\n }\n\n const { prev, totalElapsed: prevTotalElapsed } = this.state;\n\n const curr = now();\n const tickInterval = curr - prev;\n const totalElapsed = prevTotalElapsed + tickInterval;\n const updates = this._interpolator.scale(totalElapsed);\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Linear envelope which interpolates between two values over a duration. Useful for audio envelopes, transitions, and animations.\n * Alternative form of `new Env(opts)`.\n */\nexport const env = Env.env;\n","import { clamp } from './clamp';\n\n/** Options for configuring a Fold transformer. */\nexport type FoldOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Fold transformer's internal state. */\nexport type FoldState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: FoldOptions): Required<FoldOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Folds (reflects) values back and forth within a configured range.\n * @param opts - {@link FoldOptions} for configuring the range.\n */\nexport class Fold {\n state: FoldState;\n\n /** Creates a new Fold instance. Alternative form of `new Fold(opts)`. */\n static fold(opts?: FoldOptions) {\n return new Fold(opts);\n }\n\n constructor(opts?: FoldOptions) {\n const { min, max } = parseOptions(opts);\n this.state = { min, max, value: min };\n }\n\n /** Updates the range bounds, folding the current value into the new range. */\n setRange(partialOpts: FoldOptions) {\n const { min, max } = { ...this.state, ...partialOpts };\n\n this.state = {\n ...this.state,\n min,\n max,\n value: transform(this.state.value, min, max),\n };\n }\n\n /** Returns the last folded value. */\n value() {\n return this.state.value;\n }\n\n /** Folds a value into the configured range and caches the result. */\n fold(n: number) {\n const { min, max } = this.state;\n const updates = transform(n, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Folds (reflects) values back and forth within a configured range.\n * Alternative form of `new Fold(opts)`.\n */\nexport const fold = Fold.fold;\n\n/**\n * Folds (reflects) a value back and forth within a range.\n * @param n - The input value.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The folded value within [min, max].\n */\nexport function transform(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n const range = hi - lo;\n\n if (range === 0) return lo;\n\n const period = range * 2;\n const offset = n - lo;\n\n // Normalize into one full bounce cycle [0, period)\n const normalized = ((offset % period) + period) % period;\n\n // First half travels forward, second half reflects back\n const value = normalized <= range ? lo + normalized : lo + period - normalized;\n\n return clamp(value, lo, hi);\n}\n","import { clamp } from './clamp';\nimport { now } from './now';\nimport { Scale } from './scale';\n\nexport const SINE_PERIOD = Math.PI * 2 - 0.0001;\n\n/** Options for configuring a Sine oscillator. */\nexport type SineOptions = {\n /** Duration of one full cycle in milliseconds. */\n duration: number;\n};\n\n/** Snapshot of a Sine oscillator's internal state. */\nexport type SineState = {\n cycle: number;\n duration: number;\n prev: number;\n totalElapsed: number;\n value: number;\n};\n\nconst getInitialState = (duration: number): SineState => ({\n cycle: 0,\n duration,\n prev: now(),\n totalElapsed: 0,\n value: 0,\n});\n\n/**\n * Time-based sine wave oscillator that outputs values between -1 and 1.\n * @param opts - {@link SineOptions} for configuring the oscillator.\n */\nexport class Sine {\n state: SineState;\n protected _interpolator: Scale;\n\n /** Creates a new Sine instance. Alternative form of `new Sine(opts)`. */\n static sine(opts: SineOptions) {\n return new Sine(opts);\n }\n\n constructor(opts: SineOptions) {\n const { duration } = opts;\n\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: 0,\n max: SINE_PERIOD,\n },\n });\n this.state = getInitialState(duration);\n }\n\n /** Updates the cycle duration. */\n setDuration(duration: number) {\n this.state = {\n ...this.state,\n duration,\n };\n }\n\n /** Resets the oscillator with optional new options. */\n reset(opts?: SineOptions) {\n const { duration } = {\n ...this.state,\n ...opts,\n };\n\n this.state = getInitialState(duration);\n }\n\n /** Returns the current oscillator value. */\n value() {\n return this.state.value;\n }\n\n /** Advances the oscillator and returns the new value. */\n next() {\n const { cycle, duration, prev, totalElapsed: prevTotalElapsed } = this.state;\n const curr = now();\n const tickInterval = curr - prev;\n const totalElapsed = prevTotalElapsed + tickInterval;\n\n const updates = clamp(Math.sin(this._interpolator.scale(totalElapsed)), -1, 1);\n\n if (cycle >= duration) {\n this.state.cycle = 0;\n } else {\n this.state.cycle = cycle + tickInterval;\n }\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Time-based sine wave oscillator that outputs values between -1 and 1.\n * Alternative form of `new Sine(opts)`.\n */\nexport const sine = Sine.sine;\n","import { clamp } from './clamp';\nimport { now } from './now';\nimport { Scale } from './scale';\n\n/** Options for configuring a Slew processor. */\nexport type SlewOptions = {\n /** Duration of each transition in milliseconds. Defaults to 1000. */\n duration?: number;\n /** Initial value. Defaults to 0. */\n value?: number;\n};\n\n/** Snapshot of a Slew processor's internal state. */\nexport type SlewState = {\n duration: number;\n from: number;\n prev: number;\n to: number;\n totalElapsed: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: SlewOptions): Required<SlewOptions> => {\n return {\n duration: 1000,\n value: 0,\n ...opts,\n };\n};\n\nconst getInitialState = (duration: number, value: number): SlewState => {\n return {\n duration,\n from: value,\n prev: now(),\n to: value,\n totalElapsed: 0,\n value,\n };\n};\n\n/**\n * Continuous interpolation processor which transitions toward a target value over a fixed duration.\n * @param opts - {@link SlewOptions} for configuring duration and initial value.\n */\nexport class Slew {\n state: SlewState;\n protected _interpolator: Scale;\n\n /** Creates a new Slew instance. Alternative form of `new Slew(opts)`. */\n static slew(opts?: SlewOptions) {\n return new Slew(opts);\n }\n\n constructor(opts?: SlewOptions) {\n const { duration, value } = parseOptions(opts);\n\n this.state = getInitialState(duration, value);\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: value,\n max: value,\n },\n });\n }\n\n /** Returns true when the current value has reached the target. */\n done() {\n return this.state.from === this.state.to || this.state.duration <= this.state.totalElapsed;\n }\n\n /** Returns the current value. */\n value() {\n if (this.done()) {\n return this.state.to;\n }\n\n return this.state.value;\n }\n\n /** Sets a new target value, beginning a transition from the current position. */\n setValue(to: number) {\n const from = this.value();\n\n this.state = {\n ...this.state,\n from,\n to,\n prev: now(),\n totalElapsed: 0,\n };\n this._interpolator.setRanges({\n to: { min: from, max: to },\n });\n }\n\n /** Updates the transition duration in milliseconds. */\n setDuration(duration: number) {\n this.state.duration = Math.max(duration, 0);\n this._interpolator.setRanges({\n from: { min: 0, max: this.state.duration },\n });\n }\n\n /** Advances the processor and returns the current value. */\n next() {\n if (this.done()) {\n return this.value();\n }\n\n const { prev, totalElapsed: prevTotalElapsed, duration } = this.state;\n\n const curr = now();\n const totalElapsed = prevTotalElapsed + (curr - prev);\n const value = this._interpolator.scale(clamp(totalElapsed, 0, duration));\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = value;\n\n return value;\n }\n}\n\n/**\n * Continuous interpolation processor which transitions toward a target value over a fixed duration.\n * Alternative form of `new Slew(opts)`.\n */\nexport const slew = Slew.slew;\n","/** Options for configuring a Wrap transformer. */\nexport type WrapOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Wrap transformer's internal state. */\nexport type WrapState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: WrapOptions): Required<WrapOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Wraps values around a configured range using modular arithmetic.\n * @param opts - {@link WrapOptions} for configuring the range.\n */\nexport class Wrap {\n state: WrapState;\n\n /** Creates a new Wrap instance. Alternative form of `new Wrap(opts)`. */\n static wrap(opts?: WrapOptions) {\n return new Wrap(opts);\n }\n\n constructor(opts?: WrapOptions) {\n const { min, max } = parseOptions(opts);\n\n this.state = { min, max, value: min };\n }\n\n /** Updates the range bounds, wrapping the current value into the new range. */\n setRange(partialOpts: WrapOptions) {\n const { min, max } = {\n ...this.state,\n ...partialOpts,\n };\n\n this.state = {\n ...this.state,\n min,\n max,\n value: transform(this.state.value, min, max),\n };\n }\n\n /** Returns the last wrapped value. */\n value() {\n return this.state.value;\n }\n\n /** Wraps a value into the configured range and caches the result. */\n wrap(n: number) {\n const { min, max } = this.state;\n const updates = transform(n, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Wraps values around a configured range using modular arithmetic.\n * Alternative form of `new Wrap(opts)`.\n */\nexport const wrap = Wrap.wrap;\n\n/**\n * Wraps a value around a range using modular arithmetic.\n * @param n - The input value.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The wrapped value within the range.\n */\nexport function transform(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n const lo = Math.min(a, b);\n const range = Math.max(a, b) - lo;\n\n if (range === 0) return lo;\n\n const offset = n - lo;\n\n return lo + (((offset % range) + range) % range);\n}\n","export const SIXTY_FPS = 1000 / 60;\nexport const MS_IN_SECOND = 1000;\nexport const MS_IN_MINUTE = 60 * MS_IN_SECOND;\nexport const MS_IN_HOUR = MS_IN_MINUTE * 60;\n","import { SIXTY_FPS } from './constants';\nimport { now } from './now';\n\n/** Snapshot of a running timer's internal state. */\nexport type TimerState = {\n initialTime: number;\n isRunning: boolean;\n iterations: number;\n prev: number;\n tickInterval: number;\n time: number;\n totalElapsed: number;\n};\n\nexport const getInitialState = (initialTime: number): TimerState => {\n return {\n initialTime,\n isRunning: false,\n iterations: -1,\n prev: 0,\n tickInterval: 0,\n time: initialTime,\n totalElapsed: 0,\n };\n};\n\nexport const processTimerState = (state: TimerState): TimerState | null => {\n const { time, prev, totalElapsed, iterations } = state;\n const curr = now();\n\n if (iterations === -1) {\n return {\n ...state,\n prev: curr,\n iterations: 0,\n };\n }\n\n const tickInterval = curr - prev;\n\n if (tickInterval <= time) {\n return null;\n }\n\n return {\n ...state,\n iterations: iterations + 1,\n prev: curr,\n tickInterval,\n totalElapsed: totalElapsed + tickInterval,\n };\n};\n\n/** Options for configuring a Metro timer. */\nexport type MetroOptions = {\n /** Interval between ticks in milliseconds. Defaults to ~16.67ms (60fps). */\n time?: number;\n};\n\nexport const parseOptions = (opts?: MetroOptions): Required<MetroOptions> => {\n return {\n time: SIXTY_FPS,\n ...opts,\n };\n};\n\n/** Callback invoked on each timer tick with the timer instance. */\nexport type TimerCallback<T extends Metro> = (timer: T) => void;\n\n/**\n * High-resolution recursive timer with variable interval, provides runtime metrics via callback for time-based calculations.\n * @param callback - {@link TimerCallback} called on each tick with the timer instance.\n * @param opts - {@link MetroOptions} for configuring the timer interval.\n */\nexport class Metro {\n state: TimerState;\n protected _listeners: TimerCallback<Metro>[];\n declare protected _timerId: ReturnType<typeof setTimeout> | number;\n\n /** Creates a new Metro instance. Alternative form of `new Metro(callback, opts)`. */\n static metro(callback: TimerCallback<Metro>, opts?: MetroOptions) {\n return new Metro(callback, opts);\n }\n\n constructor(callback: TimerCallback<Metro>, opts?: MetroOptions) {\n const { time } = parseOptions(opts);\n this.state = getInitialState(time);\n this._listeners = [callback];\n }\n\n protected asyncHandler(callback: () => void) {\n this._timerId = setTimeout(callback, SIXTY_FPS);\n }\n\n protected clearAsyncHandler() {\n clearTimeout(this._timerId);\n }\n\n /** Stops the timer and returns total elapsed time in milliseconds. */\n stop = () => {\n const { totalElapsed } = this.state;\n this.reset();\n this.clearAsyncHandler();\n\n return totalElapsed;\n };\n\n /** Resets state to initial values. */\n reset = () => {\n const { initialTime } = this.state;\n this.state = getInitialState(initialTime);\n };\n\n /** Updates the tick interval in milliseconds. */\n setTime = (updatedTime = this.state.time) => {\n const time = Math.max(updatedTime, 0);\n\n this.state = {\n ...this.state,\n time,\n initialTime: time,\n };\n };\n\n /** Starts the timer loop. */\n run = () => {\n if (this.state.isRunning) {\n this.stop();\n }\n\n this.state = {\n ...this.state,\n isRunning: true,\n prev: now(),\n };\n\n const tick = () => {\n const updates = processTimerState(this.state);\n\n if (updates) {\n this.state = updates;\n this._listeners.forEach((listener) => {\n listener(this);\n });\n }\n\n if (this.state.isRunning) {\n this.asyncHandler(tick);\n }\n };\n\n tick();\n };\n}\n\n/**\n * High-resolution recursive timer with variable interval, provides runtime metrics via callback for time-based calculations.\n * Alternative form of `new Metro(callback, opts)`.\n */\nexport const metro = Metro.metro;\n","import { MS_IN_SECOND, MS_IN_MINUTE, MS_IN_HOUR } from './constants';\n\nexport type FPS = 15 | 30 | 60;\n\nexport enum TimeFormat {\n FPS = 'fps',\n HOURS = 'h',\n HZ = 'hz',\n MILLISECONDS = 'ms',\n MINUTES = 'm',\n SECONDS = 's',\n}\n\nexport type AvailableTimeFormats = `${TimeFormat}`;\n\nexport const FORMAT_IDENTIFIERS: AvailableTimeFormats[] = [\n TimeFormat.FPS,\n TimeFormat.HOURS,\n TimeFormat.HZ,\n TimeFormat.MILLISECONDS,\n TimeFormat.MINUTES,\n TimeFormat.SECONDS,\n]\n // Desc length sort so that `ms` matches prior to `m`\n .sort((a, b) => b.length - a.length);\n\ntype FormatGetter = (val: number) => number;\n\nconst FORMATTERS = new Map<AvailableTimeFormats, FormatGetter>([\n [TimeFormat.FPS, (val: number) => MS_IN_SECOND / val],\n [TimeFormat.HOURS, (val: number) => val * MS_IN_HOUR],\n [TimeFormat.HZ, (val: number) => (1 / val) * MS_IN_SECOND],\n [TimeFormat.MILLISECONDS, (val: number) => val],\n [TimeFormat.MINUTES, (val: number) => val * MS_IN_MINUTE],\n [TimeFormat.SECONDS, (val: number) => val * MS_IN_SECOND],\n]);\n\nconst sanitizeStringVal = (val: string) => val.toLocaleLowerCase().trim();\n\nconst parseStringValAndFormat = (val: string) => {\n for (let i = 0; i < FORMAT_IDENTIFIERS.length; i += 1) {\n const format = FORMAT_IDENTIFIERS[i];\n\n if (val.includes(format)) {\n const value = Number(val.replace(' ', '').replace(format, ''));\n\n return {\n format,\n value,\n };\n }\n }\n\n return {\n format: undefined,\n value: undefined,\n };\n};\n\nexport function ms(val: string | null | undefined): number | undefined;\nexport function ms(\n val: string | number | null | undefined,\n format?: AvailableTimeFormats | TimeFormat\n): number | undefined;\n\n/**\n * Converts time format strings or numeric values to their corresponding value in milliseconds.\n * @param val - A string like `'60fps'`, `'2s'`, or a numeric value.\n * @param format - Explicit time format when `val` is a number.\n * @returns Milliseconds, or undefined if the input is invalid.\n */\nexport function ms(\n val: string | number | null | undefined,\n format?: AvailableTimeFormats | TimeFormat\n): number | undefined {\n let parsedValue: number | null | undefined = null;\n let parsedFormat: AvailableTimeFormats = format || TimeFormat.MILLISECONDS;\n\n if (typeof val === 'string') {\n const parsed = parseStringValAndFormat(sanitizeStringVal(val));\n\n if (typeof parsed.value !== 'undefined') {\n parsedValue = parsed.value;\n }\n\n if (parsed.format) {\n parsedFormat = parsed.format;\n }\n } else {\n parsedValue = val;\n }\n\n if (typeof parsedValue === 'undefined' || parsedValue === null || Number.isNaN(parsedValue)) {\n return undefined;\n }\n\n const formatter = FORMATTERS.get(parsedFormat);\n\n if (!formatter) {\n return undefined;\n }\n\n return formatter(parsedValue);\n}\n","import { Metro, type TimerCallback, type MetroOptions } from './metro';\nimport { ms, TimeFormat, type FPS } from './ms';\n\n/** Options for configuring a Frames timer. */\nexport type FramesOptions = {\n /** Target frames per second (15, 30, or 60). Defaults to 60. */\n fps: FPS;\n};\n\nexport const DEFAULT_FPS: FPS = 60;\n\nexport const parseOptions = (opts?: FramesOptions): MetroOptions => {\n const { fps } = {\n fps: DEFAULT_FPS,\n ...opts,\n };\n\n return {\n time: ms(fps, TimeFormat.FPS),\n };\n};\n\n/**\n * Animation-loop timer that uses requestAnimationFrame when available.\n * @param callback - {@link TimerCallback} called on each frame tick.\n * @param opts - {@link FramesOptions} for configuring the target frame rate.\n */\nexport class Frames extends Metro {\n declare protected _timerId: ReturnType<typeof requestAnimationFrame>;\n\n /** Creates a new Frames instance. Alternative form of `new Frames(callback, opts)`. */\n static frames(callback: TimerCallback<Frames>, opts?: FramesOptions) {\n return new Frames(callback, opts);\n }\n\n constructor(callback: TimerCallback<Frames>, opts?: FramesOptions) {\n super(() => callback(this), parseOptions(opts));\n }\n\n protected asyncHandler(callback: () => void) {\n if (typeof window === 'undefined' || !('requestAnimationFrame' in window)) {\n super.asyncHandler(callback);\n } else {\n this._timerId = requestAnimationFrame(callback);\n }\n }\n\n protected clearAsyncHandler() {\n if (typeof window === 'undefined' || !('cancelAnimationFrame' in window)) {\n super.clearAsyncHandler();\n } else {\n cancelAnimationFrame(this._timerId);\n }\n }\n\n /** Updates the target frames per second. */\n setFPS = (fps = DEFAULT_FPS) => {\n this.setTime(ms(fps, TimeFormat.FPS));\n };\n}\n\n/**\n * Animation-loop timer that uses requestAnimationFrame when available.\n * Alternative form of `new Frames(callback, opts)`.\n */\nexport const frames = Frames.frames;\n","import { clamp } from './clamp';\n\n/**\n * Scales 0...1 by Euler's number to produce a natural feeling curve.\n * @param n - Input value (clamped to 0-1).\n * @returns The exponentially scaled value.\n */\nexport function expo(n: number): number {\n return Math.pow(clamp(n, 0, 1), Math.E);\n}\n","import { clamp } from './clamp';\n\nfunction logistic(v: number, k: number): number {\n return 1 / (1 + Math.exp(-k * (v - 0.5)));\n}\n\n/**\n * A normalized sigmoid curve which maps 0...1 → 0...1 for use as a transfer function or waveshaper.\n *\n * The steepness parameter `k` controls the shape — higher values produce a\n * more aggressive S-curve, while k = 0 it's linear.\n * @param n - Input value (clamped to 0...1).\n * @param k - Steepness of the curve (default 5).\n * @returns The shaped value.\n */\nexport function sigmoid(n: number, k = 5): number {\n const x = clamp(n, 0, 1);\n if (k === 0) return x;\n\n const f0 = logistic(0, k);\n\n return (logistic(x, k) - f0) / (logistic(1, k) - f0);\n}\n","import { clamp } from './clamp';\n\n/**\n * A normalized tanh curve which maps -1...1 → -1...1 for use as a transfer function or waveshaper.\n *\n * The steepness parameter `k` controls saturation — higher values push the\n * curve toward hard clipping at the edges, while at k = 0 it's linear.\n * @param n - Input value (clamped to -1...1).\n * @param k - Steepness of the curve (default 5).\n * @returns The shaped value.\n */\nexport function tanh(n: number, k = 5): number {\n const x = clamp(n, -1, 1);\n if (k === 0) return x;\n\n return Math.tanh(k * x) / Math.tanh(k);\n}\n","/**\n * Promisified setTimeout.\n * @param time - Delay in milliseconds.\n * @returns A promise that resolves after the delay.\n */\nexport function wait(time: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, time));\n}\n"],"mappings":"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","names":["parseOptions","initialNow","parseOptions","updateStateFromOptions","parseOptions","getInitialState","parseOptions","getInitialState","parseOptions","transform","getInitialState","parseOptions","TimeFormat","parseOptions"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -109,8 +109,8 @@ type ScaleState = {
|
|
|
109
109
|
*/
|
|
110
110
|
declare class Scale {
|
|
111
111
|
state: ScaleState;
|
|
112
|
-
/**
|
|
113
|
-
static scale(
|
|
112
|
+
/** Creates a new Scale instance. Alternative form of `new Scale(opts)`. */
|
|
113
|
+
static scale(opts?: ScaleOptions): Scale;
|
|
114
114
|
constructor(opts?: ScaleOptions);
|
|
115
115
|
/** Updates input and/or output ranges, recomputing the internal ratio. */
|
|
116
116
|
setRanges(opts: ScaleOptions): void;
|
|
@@ -123,7 +123,7 @@ declare class Scale {
|
|
|
123
123
|
}
|
|
124
124
|
/**
|
|
125
125
|
* Linear map of values from one range to another, supports negative values and inversion.
|
|
126
|
-
*
|
|
126
|
+
* Alternative form of `new Scale(opts)`.
|
|
127
127
|
*/
|
|
128
128
|
declare const scale: typeof Scale.scale;
|
|
129
129
|
|
|
@@ -191,8 +191,8 @@ type FoldState = {
|
|
|
191
191
|
*/
|
|
192
192
|
declare class Fold {
|
|
193
193
|
state: FoldState;
|
|
194
|
-
/**
|
|
195
|
-
static fold(
|
|
194
|
+
/** Creates a new Fold instance. Alternative form of `new Fold(opts)`. */
|
|
195
|
+
static fold(opts?: FoldOptions): Fold;
|
|
196
196
|
constructor(opts?: FoldOptions);
|
|
197
197
|
/** Updates the range bounds, folding the current value into the new range. */
|
|
198
198
|
setRange(partialOpts: FoldOptions): void;
|
|
@@ -203,7 +203,7 @@ declare class Fold {
|
|
|
203
203
|
}
|
|
204
204
|
/**
|
|
205
205
|
* Folds (reflects) values back and forth within a configured range.
|
|
206
|
-
*
|
|
206
|
+
* Alternative form of `new Fold(opts)`.
|
|
207
207
|
*/
|
|
208
208
|
declare const fold: typeof Fold.fold;
|
|
209
209
|
|
|
@@ -246,6 +246,49 @@ declare class Sine {
|
|
|
246
246
|
*/
|
|
247
247
|
declare const sine: typeof Sine.sine;
|
|
248
248
|
|
|
249
|
+
/** Options for configuring a Slew processor. */
|
|
250
|
+
type SlewOptions = {
|
|
251
|
+
/** Duration of each transition in milliseconds. Defaults to 1000. */
|
|
252
|
+
duration?: number;
|
|
253
|
+
/** Initial value. Defaults to 0. */
|
|
254
|
+
value?: number;
|
|
255
|
+
};
|
|
256
|
+
/** Snapshot of a Slew processor's internal state. */
|
|
257
|
+
type SlewState = {
|
|
258
|
+
duration: number;
|
|
259
|
+
from: number;
|
|
260
|
+
prev: number;
|
|
261
|
+
to: number;
|
|
262
|
+
totalElapsed: number;
|
|
263
|
+
value: number;
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* Continuous interpolation processor which transitions toward a target value over a fixed duration.
|
|
267
|
+
* @param opts - {@link SlewOptions} for configuring duration and initial value.
|
|
268
|
+
*/
|
|
269
|
+
declare class Slew {
|
|
270
|
+
state: SlewState;
|
|
271
|
+
protected _interpolator: Scale;
|
|
272
|
+
/** Creates a new Slew instance. Alternative form of `new Slew(opts)`. */
|
|
273
|
+
static slew(opts?: SlewOptions): Slew;
|
|
274
|
+
constructor(opts?: SlewOptions);
|
|
275
|
+
/** Returns true when the current value has reached the target. */
|
|
276
|
+
done(): boolean;
|
|
277
|
+
/** Returns the current value. */
|
|
278
|
+
value(): number;
|
|
279
|
+
/** Sets a new target value, beginning a transition from the current position. */
|
|
280
|
+
setValue(to: number): void;
|
|
281
|
+
/** Updates the transition duration in milliseconds. */
|
|
282
|
+
setDuration(duration: number): void;
|
|
283
|
+
/** Advances the processor and returns the current value. */
|
|
284
|
+
next(): number;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Continuous interpolation processor which transitions toward a target value over a fixed duration.
|
|
288
|
+
* Alternative form of `new Slew(opts)`.
|
|
289
|
+
*/
|
|
290
|
+
declare const slew: typeof Slew.slew;
|
|
291
|
+
|
|
249
292
|
/** Options for configuring a Wrap transformer. */
|
|
250
293
|
type WrapOptions = {
|
|
251
294
|
/** Lower bound of the range. Defaults to 0. */
|
|
@@ -265,8 +308,8 @@ type WrapState = {
|
|
|
265
308
|
*/
|
|
266
309
|
declare class Wrap {
|
|
267
310
|
state: WrapState;
|
|
268
|
-
/**
|
|
269
|
-
static wrap(
|
|
311
|
+
/** Creates a new Wrap instance. Alternative form of `new Wrap(opts)`. */
|
|
312
|
+
static wrap(opts?: WrapOptions): Wrap;
|
|
270
313
|
constructor(opts?: WrapOptions);
|
|
271
314
|
/** Updates the range bounds, wrapping the current value into the new range. */
|
|
272
315
|
setRange(partialOpts: WrapOptions): void;
|
|
@@ -277,7 +320,7 @@ declare class Wrap {
|
|
|
277
320
|
}
|
|
278
321
|
/**
|
|
279
322
|
* Wraps values around a configured range using modular arithmetic.
|
|
280
|
-
*
|
|
323
|
+
* Alternative form of `new Wrap(opts)`.
|
|
281
324
|
*/
|
|
282
325
|
declare const wrap: typeof Wrap.wrap;
|
|
283
326
|
|
|
@@ -417,4 +460,4 @@ declare const MS_IN_SECOND = 1000;
|
|
|
417
460
|
declare const MS_IN_MINUTE: number;
|
|
418
461
|
declare const MS_IN_HOUR: number;
|
|
419
462
|
|
|
420
|
-
export { Drunk, type DrunkOptions, type DrunkState, Env, type EnvOptions, type EnvState, type FPS, Fold, type FoldOptions, type FoldState, Frames, type FramesOptions, MS_IN_HOUR, MS_IN_MINUTE, MS_IN_SECOND, Metro, type MetroOptions, Rand, type RandOptions, type RandState, SINE_PERIOD, SIXTY_FPS, Scale, type ScaleOptions, type ScaleRange, type ScaleState, Sine, type SineOptions, type SineState, TimeFormat, type TimerCallback, Wrap, type WrapOptions, type WrapState, clamp, drunk, env, expo, fold, frames, metro, ms, now, rand, scale, sigmoid, sine, tanh, wait, wrap };
|
|
463
|
+
export { Drunk, type DrunkOptions, type DrunkState, Env, type EnvOptions, type EnvState, type FPS, Fold, type FoldOptions, type FoldState, Frames, type FramesOptions, MS_IN_HOUR, MS_IN_MINUTE, MS_IN_SECOND, Metro, type MetroOptions, Rand, type RandOptions, type RandState, SINE_PERIOD, SIXTY_FPS, Scale, type ScaleOptions, type ScaleRange, type ScaleState, Sine, type SineOptions, type SineState, Slew, type SlewOptions, type SlewState, TimeFormat, type TimerCallback, type TimerState, Wrap, type WrapOptions, type WrapState, clamp, drunk, env, expo, fold, frames, metro, ms, now, rand, scale, sigmoid, sine, slew, tanh, wait, wrap };
|
package/dist/index.d.ts
CHANGED
|
@@ -109,8 +109,8 @@ type ScaleState = {
|
|
|
109
109
|
*/
|
|
110
110
|
declare class Scale {
|
|
111
111
|
state: ScaleState;
|
|
112
|
-
/**
|
|
113
|
-
static scale(
|
|
112
|
+
/** Creates a new Scale instance. Alternative form of `new Scale(opts)`. */
|
|
113
|
+
static scale(opts?: ScaleOptions): Scale;
|
|
114
114
|
constructor(opts?: ScaleOptions);
|
|
115
115
|
/** Updates input and/or output ranges, recomputing the internal ratio. */
|
|
116
116
|
setRanges(opts: ScaleOptions): void;
|
|
@@ -123,7 +123,7 @@ declare class Scale {
|
|
|
123
123
|
}
|
|
124
124
|
/**
|
|
125
125
|
* Linear map of values from one range to another, supports negative values and inversion.
|
|
126
|
-
*
|
|
126
|
+
* Alternative form of `new Scale(opts)`.
|
|
127
127
|
*/
|
|
128
128
|
declare const scale: typeof Scale.scale;
|
|
129
129
|
|
|
@@ -191,8 +191,8 @@ type FoldState = {
|
|
|
191
191
|
*/
|
|
192
192
|
declare class Fold {
|
|
193
193
|
state: FoldState;
|
|
194
|
-
/**
|
|
195
|
-
static fold(
|
|
194
|
+
/** Creates a new Fold instance. Alternative form of `new Fold(opts)`. */
|
|
195
|
+
static fold(opts?: FoldOptions): Fold;
|
|
196
196
|
constructor(opts?: FoldOptions);
|
|
197
197
|
/** Updates the range bounds, folding the current value into the new range. */
|
|
198
198
|
setRange(partialOpts: FoldOptions): void;
|
|
@@ -203,7 +203,7 @@ declare class Fold {
|
|
|
203
203
|
}
|
|
204
204
|
/**
|
|
205
205
|
* Folds (reflects) values back and forth within a configured range.
|
|
206
|
-
*
|
|
206
|
+
* Alternative form of `new Fold(opts)`.
|
|
207
207
|
*/
|
|
208
208
|
declare const fold: typeof Fold.fold;
|
|
209
209
|
|
|
@@ -246,6 +246,49 @@ declare class Sine {
|
|
|
246
246
|
*/
|
|
247
247
|
declare const sine: typeof Sine.sine;
|
|
248
248
|
|
|
249
|
+
/** Options for configuring a Slew processor. */
|
|
250
|
+
type SlewOptions = {
|
|
251
|
+
/** Duration of each transition in milliseconds. Defaults to 1000. */
|
|
252
|
+
duration?: number;
|
|
253
|
+
/** Initial value. Defaults to 0. */
|
|
254
|
+
value?: number;
|
|
255
|
+
};
|
|
256
|
+
/** Snapshot of a Slew processor's internal state. */
|
|
257
|
+
type SlewState = {
|
|
258
|
+
duration: number;
|
|
259
|
+
from: number;
|
|
260
|
+
prev: number;
|
|
261
|
+
to: number;
|
|
262
|
+
totalElapsed: number;
|
|
263
|
+
value: number;
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* Continuous interpolation processor which transitions toward a target value over a fixed duration.
|
|
267
|
+
* @param opts - {@link SlewOptions} for configuring duration and initial value.
|
|
268
|
+
*/
|
|
269
|
+
declare class Slew {
|
|
270
|
+
state: SlewState;
|
|
271
|
+
protected _interpolator: Scale;
|
|
272
|
+
/** Creates a new Slew instance. Alternative form of `new Slew(opts)`. */
|
|
273
|
+
static slew(opts?: SlewOptions): Slew;
|
|
274
|
+
constructor(opts?: SlewOptions);
|
|
275
|
+
/** Returns true when the current value has reached the target. */
|
|
276
|
+
done(): boolean;
|
|
277
|
+
/** Returns the current value. */
|
|
278
|
+
value(): number;
|
|
279
|
+
/** Sets a new target value, beginning a transition from the current position. */
|
|
280
|
+
setValue(to: number): void;
|
|
281
|
+
/** Updates the transition duration in milliseconds. */
|
|
282
|
+
setDuration(duration: number): void;
|
|
283
|
+
/** Advances the processor and returns the current value. */
|
|
284
|
+
next(): number;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Continuous interpolation processor which transitions toward a target value over a fixed duration.
|
|
288
|
+
* Alternative form of `new Slew(opts)`.
|
|
289
|
+
*/
|
|
290
|
+
declare const slew: typeof Slew.slew;
|
|
291
|
+
|
|
249
292
|
/** Options for configuring a Wrap transformer. */
|
|
250
293
|
type WrapOptions = {
|
|
251
294
|
/** Lower bound of the range. Defaults to 0. */
|
|
@@ -265,8 +308,8 @@ type WrapState = {
|
|
|
265
308
|
*/
|
|
266
309
|
declare class Wrap {
|
|
267
310
|
state: WrapState;
|
|
268
|
-
/**
|
|
269
|
-
static wrap(
|
|
311
|
+
/** Creates a new Wrap instance. Alternative form of `new Wrap(opts)`. */
|
|
312
|
+
static wrap(opts?: WrapOptions): Wrap;
|
|
270
313
|
constructor(opts?: WrapOptions);
|
|
271
314
|
/** Updates the range bounds, wrapping the current value into the new range. */
|
|
272
315
|
setRange(partialOpts: WrapOptions): void;
|
|
@@ -277,7 +320,7 @@ declare class Wrap {
|
|
|
277
320
|
}
|
|
278
321
|
/**
|
|
279
322
|
* Wraps values around a configured range using modular arithmetic.
|
|
280
|
-
*
|
|
323
|
+
* Alternative form of `new Wrap(opts)`.
|
|
281
324
|
*/
|
|
282
325
|
declare const wrap: typeof Wrap.wrap;
|
|
283
326
|
|
|
@@ -417,4 +460,4 @@ declare const MS_IN_SECOND = 1000;
|
|
|
417
460
|
declare const MS_IN_MINUTE: number;
|
|
418
461
|
declare const MS_IN_HOUR: number;
|
|
419
462
|
|
|
420
|
-
export { Drunk, type DrunkOptions, type DrunkState, Env, type EnvOptions, type EnvState, type FPS, Fold, type FoldOptions, type FoldState, Frames, type FramesOptions, MS_IN_HOUR, MS_IN_MINUTE, MS_IN_SECOND, Metro, type MetroOptions, Rand, type RandOptions, type RandState, SINE_PERIOD, SIXTY_FPS, Scale, type ScaleOptions, type ScaleRange, type ScaleState, Sine, type SineOptions, type SineState, TimeFormat, type TimerCallback, Wrap, type WrapOptions, type WrapState, clamp, drunk, env, expo, fold, frames, metro, ms, now, rand, scale, sigmoid, sine, tanh, wait, wrap };
|
|
463
|
+
export { Drunk, type DrunkOptions, type DrunkState, Env, type EnvOptions, type EnvState, type FPS, Fold, type FoldOptions, type FoldState, Frames, type FramesOptions, MS_IN_HOUR, MS_IN_MINUTE, MS_IN_SECOND, Metro, type MetroOptions, Rand, type RandOptions, type RandState, SINE_PERIOD, SIXTY_FPS, Scale, type ScaleOptions, type ScaleRange, type ScaleState, Sine, type SineOptions, type SineState, Slew, type SlewOptions, type SlewState, TimeFormat, type TimerCallback, type TimerState, Wrap, type WrapOptions, type WrapState, clamp, drunk, env, expo, fold, frames, metro, ms, now, rand, scale, sigmoid, sine, slew, tanh, wait, wrap };
|
package/dist/index.js
CHANGED
|
@@ -219,9 +219,9 @@ var Scale = class _Scale {
|
|
|
219
219
|
__publicField(this, "state");
|
|
220
220
|
this.state = parseInitialState(opts);
|
|
221
221
|
}
|
|
222
|
-
/**
|
|
223
|
-
static scale(
|
|
224
|
-
return new _Scale(opts)
|
|
222
|
+
/** Creates a new Scale instance. Alternative form of `new Scale(opts)`. */
|
|
223
|
+
static scale(opts) {
|
|
224
|
+
return new _Scale(opts);
|
|
225
225
|
}
|
|
226
226
|
/** Updates input and/or output ranges, recomputing the internal ratio. */
|
|
227
227
|
setRanges(opts) {
|
|
@@ -372,9 +372,9 @@ var Fold = class _Fold {
|
|
|
372
372
|
const { min, max } = parseOptions4(opts);
|
|
373
373
|
this.state = { min, max, value: min };
|
|
374
374
|
}
|
|
375
|
-
/**
|
|
376
|
-
static fold(
|
|
377
|
-
return new _Fold(opts)
|
|
375
|
+
/** Creates a new Fold instance. Alternative form of `new Fold(opts)`. */
|
|
376
|
+
static fold(opts) {
|
|
377
|
+
return new _Fold(opts);
|
|
378
378
|
}
|
|
379
379
|
/** Updates the range bounds, folding the current value into the new range. */
|
|
380
380
|
setRange(partialOpts) {
|
|
@@ -491,8 +491,96 @@ var Sine = class _Sine {
|
|
|
491
491
|
};
|
|
492
492
|
var sine = Sine.sine;
|
|
493
493
|
|
|
494
|
-
// src/
|
|
494
|
+
// src/slew.ts
|
|
495
495
|
var parseOptions5 = (opts) => {
|
|
496
|
+
return {
|
|
497
|
+
duration: 1e3,
|
|
498
|
+
value: 0,
|
|
499
|
+
...opts
|
|
500
|
+
};
|
|
501
|
+
};
|
|
502
|
+
var getInitialState3 = (duration, value) => {
|
|
503
|
+
return {
|
|
504
|
+
duration,
|
|
505
|
+
from: value,
|
|
506
|
+
prev: now(),
|
|
507
|
+
to: value,
|
|
508
|
+
totalElapsed: 0,
|
|
509
|
+
value
|
|
510
|
+
};
|
|
511
|
+
};
|
|
512
|
+
var Slew = class _Slew {
|
|
513
|
+
constructor(opts) {
|
|
514
|
+
__publicField(this, "state");
|
|
515
|
+
__publicField(this, "_interpolator");
|
|
516
|
+
const { duration, value } = parseOptions5(opts);
|
|
517
|
+
this.state = getInitialState3(duration, value);
|
|
518
|
+
this._interpolator = new Scale({
|
|
519
|
+
from: {
|
|
520
|
+
min: 0,
|
|
521
|
+
max: duration
|
|
522
|
+
},
|
|
523
|
+
to: {
|
|
524
|
+
min: value,
|
|
525
|
+
max: value
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
/** Creates a new Slew instance. Alternative form of `new Slew(opts)`. */
|
|
530
|
+
static slew(opts) {
|
|
531
|
+
return new _Slew(opts);
|
|
532
|
+
}
|
|
533
|
+
/** Returns true when the current value has reached the target. */
|
|
534
|
+
done() {
|
|
535
|
+
return this.state.from === this.state.to || this.state.duration <= this.state.totalElapsed;
|
|
536
|
+
}
|
|
537
|
+
/** Returns the current value. */
|
|
538
|
+
value() {
|
|
539
|
+
if (this.done()) {
|
|
540
|
+
return this.state.to;
|
|
541
|
+
}
|
|
542
|
+
return this.state.value;
|
|
543
|
+
}
|
|
544
|
+
/** Sets a new target value, beginning a transition from the current position. */
|
|
545
|
+
setValue(to) {
|
|
546
|
+
const from = this.value();
|
|
547
|
+
this.state = {
|
|
548
|
+
...this.state,
|
|
549
|
+
from,
|
|
550
|
+
to,
|
|
551
|
+
prev: now(),
|
|
552
|
+
totalElapsed: 0
|
|
553
|
+
};
|
|
554
|
+
this._interpolator.setRanges({
|
|
555
|
+
to: { min: from, max: to }
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
/** Updates the transition duration in milliseconds. */
|
|
559
|
+
setDuration(duration) {
|
|
560
|
+
this.state.duration = Math.max(duration, 0);
|
|
561
|
+
this._interpolator.setRanges({
|
|
562
|
+
from: { min: 0, max: this.state.duration }
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
/** Advances the processor and returns the current value. */
|
|
566
|
+
next() {
|
|
567
|
+
if (this.done()) {
|
|
568
|
+
return this.value();
|
|
569
|
+
}
|
|
570
|
+
const { prev, totalElapsed: prevTotalElapsed, duration } = this.state;
|
|
571
|
+
const curr = now();
|
|
572
|
+
const totalElapsed = prevTotalElapsed + (curr - prev);
|
|
573
|
+
const value = this._interpolator.scale(clamp(totalElapsed, 0, duration));
|
|
574
|
+
this.state.prev = curr;
|
|
575
|
+
this.state.totalElapsed = totalElapsed;
|
|
576
|
+
this.state.value = value;
|
|
577
|
+
return value;
|
|
578
|
+
}
|
|
579
|
+
};
|
|
580
|
+
var slew = Slew.slew;
|
|
581
|
+
|
|
582
|
+
// src/wrap.ts
|
|
583
|
+
var parseOptions6 = (opts) => {
|
|
496
584
|
return {
|
|
497
585
|
min: 0,
|
|
498
586
|
max: 1,
|
|
@@ -502,12 +590,12 @@ var parseOptions5 = (opts) => {
|
|
|
502
590
|
var Wrap = class _Wrap {
|
|
503
591
|
constructor(opts) {
|
|
504
592
|
__publicField(this, "state");
|
|
505
|
-
const { min, max } =
|
|
593
|
+
const { min, max } = parseOptions6(opts);
|
|
506
594
|
this.state = { min, max, value: min };
|
|
507
595
|
}
|
|
508
|
-
/**
|
|
509
|
-
static wrap(
|
|
510
|
-
return new _Wrap(opts)
|
|
596
|
+
/** Creates a new Wrap instance. Alternative form of `new Wrap(opts)`. */
|
|
597
|
+
static wrap(opts) {
|
|
598
|
+
return new _Wrap(opts);
|
|
511
599
|
}
|
|
512
600
|
/** Updates the range bounds, wrapping the current value into the new range. */
|
|
513
601
|
setRange(partialOpts) {
|
|
@@ -561,7 +649,7 @@ var MS_IN_MINUTE = 60 * MS_IN_SECOND;
|
|
|
561
649
|
var MS_IN_HOUR = MS_IN_MINUTE * 60;
|
|
562
650
|
|
|
563
651
|
// src/metro.ts
|
|
564
|
-
var
|
|
652
|
+
var getInitialState4 = (initialTime) => {
|
|
565
653
|
return {
|
|
566
654
|
initialTime,
|
|
567
655
|
isRunning: false,
|
|
@@ -594,7 +682,7 @@ var processTimerState = (state) => {
|
|
|
594
682
|
totalElapsed: totalElapsed + tickInterval
|
|
595
683
|
};
|
|
596
684
|
};
|
|
597
|
-
var
|
|
685
|
+
var parseOptions7 = (opts) => {
|
|
598
686
|
return {
|
|
599
687
|
time: SIXTY_FPS,
|
|
600
688
|
...opts
|
|
@@ -614,7 +702,7 @@ var Metro = class _Metro {
|
|
|
614
702
|
/** Resets state to initial values. */
|
|
615
703
|
__publicField(this, "reset", () => {
|
|
616
704
|
const { initialTime } = this.state;
|
|
617
|
-
this.state =
|
|
705
|
+
this.state = getInitialState4(initialTime);
|
|
618
706
|
});
|
|
619
707
|
/** Updates the tick interval in milliseconds. */
|
|
620
708
|
__publicField(this, "setTime", (updatedTime = this.state.time) => {
|
|
@@ -649,8 +737,8 @@ var Metro = class _Metro {
|
|
|
649
737
|
};
|
|
650
738
|
tick();
|
|
651
739
|
});
|
|
652
|
-
const { time } =
|
|
653
|
-
this.state =
|
|
740
|
+
const { time } = parseOptions7(opts);
|
|
741
|
+
this.state = getInitialState4(time);
|
|
654
742
|
this._listeners = [callback];
|
|
655
743
|
}
|
|
656
744
|
/** Creates a new Metro instance. Alternative form of `new Metro(callback, opts)`. */
|
|
@@ -735,7 +823,7 @@ function ms(val, format) {
|
|
|
735
823
|
|
|
736
824
|
// src/frames.ts
|
|
737
825
|
var DEFAULT_FPS = 60;
|
|
738
|
-
var
|
|
826
|
+
var parseOptions8 = (opts) => {
|
|
739
827
|
const { fps } = {
|
|
740
828
|
fps: DEFAULT_FPS,
|
|
741
829
|
...opts
|
|
@@ -746,7 +834,7 @@ var parseOptions7 = (opts) => {
|
|
|
746
834
|
};
|
|
747
835
|
var Frames = class _Frames extends Metro {
|
|
748
836
|
constructor(callback, opts) {
|
|
749
|
-
super(() => callback(this),
|
|
837
|
+
super(() => callback(this), parseOptions8(opts));
|
|
750
838
|
/** Updates the target frames per second. */
|
|
751
839
|
__publicField(this, "setFPS", (fps = DEFAULT_FPS) => {
|
|
752
840
|
this.setTime(ms(fps, "fps" /* FPS */));
|
|
@@ -814,6 +902,7 @@ export {
|
|
|
814
902
|
SIXTY_FPS,
|
|
815
903
|
Scale,
|
|
816
904
|
Sine,
|
|
905
|
+
Slew,
|
|
817
906
|
TimeFormat,
|
|
818
907
|
Wrap,
|
|
819
908
|
clamp,
|
|
@@ -829,6 +918,7 @@ export {
|
|
|
829
918
|
scale,
|
|
830
919
|
sigmoid,
|
|
831
920
|
sine,
|
|
921
|
+
slew,
|
|
832
922
|
tanh,
|
|
833
923
|
wait,
|
|
834
924
|
wrap
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clamp.ts","../src/rand.ts","../src/drunk.ts","../src/now.ts","../src/scale.ts","../src/env.ts","../src/fold.ts","../src/sine.ts","../src/wrap.ts","../src/constants.ts","../src/metro.ts","../src/ms.ts","../src/frames.ts","../src/expo.ts","../src/sigmoid.ts","../src/tanh.ts","../src/wait.ts"],"sourcesContent":["export function clamp(n: number): number;\nexport function clamp(n: number, max: number): number;\nexport function clamp(n: number, min: number, max: number): number;\n\n/**\n * Constrains an input value to a min...max range.\n * @param n - The value to constrain.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The clamped value.\n */\nexport function clamp(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n return Math.min(Math.max(n, a), b);\n}\n","import { clamp } from './clamp';\n\n/** Options for configuring a Rand generator. */\nexport type RandOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Rand generator's internal state. */\nexport type RandState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: RandOptions): Required<RandOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Random number generator that produces values within a bounded range.\n * @param opts - {@link RandOptions} for configuring the range.\n */\nexport class Rand {\n state: RandState;\n\n /** Returns a single random value. One-off form of `new Rand(opts).value()`. */\n static rand(opts?: RandOptions) {\n return new Rand(opts).value();\n }\n\n constructor(opts?: RandOptions) {\n const { min, max } = parseOptions(opts);\n\n this.state = { max, min, value: 0 };\n this.next();\n }\n\n /** Updates the range bounds, clamping the current value if needed. */\n setRange(partialOpts: RandOptions) {\n const { value = 0 } = this.state;\n const { min, max } = {\n ...this.state,\n ...partialOpts,\n };\n\n this.state = {\n ...this.state,\n max,\n min,\n value: clamp(value, min, max),\n };\n }\n\n /** Returns the current value. */\n value() {\n return this.state.value;\n }\n\n /** Generates a new random value within the range. */\n next() {\n const { min, max } = this.state;\n const updates = Math.random() * (max - min) + min;\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Random number generator that produces values within a bounded range.\n * One-off form of `new Rand(opts).value()`.\n */\nexport const rand = Rand.rand;\n","import { clamp } from './clamp';\nimport { Rand } from './rand';\n\nexport const DEFAULT_DRUNK_STEP = 0.1;\n\n/** Options for configuring a Drunk random walk. */\nexport type DrunkOptions = {\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Initial value. If omitted, a random value within the range is used. */\n startsAt?: number;\n /** Maximum step size as a fraction of the range (0-1). Defaults to 0.1. */\n step?: number;\n};\n\n/** Snapshot of a Drunk walk's internal state. */\nexport type DrunkState = {\n initialValue: number;\n max: number;\n min: number;\n step: number;\n value: number;\n};\n\nexport const parseStepSize = (step?: number): number =>\n typeof step !== 'undefined' ? clamp(step, 0, 1) : DEFAULT_DRUNK_STEP;\n\nexport const parseOptions = (opts?: DrunkOptions): Required<DrunkOptions> => {\n const { step, ...restOpts } = opts || {};\n const parsedStepSize = parseStepSize(step);\n\n return {\n max: 1,\n min: 0,\n startsAt: 0,\n step: parsedStepSize,\n ...restOpts,\n };\n};\n\n/**\n * Stochastic random walk generator that produces values within a bounded range.\n * @param opts - {@link DrunkOptions} for configuring the walk.\n */\nexport class Drunk {\n state: DrunkState;\n protected _initialValue: Rand;\n protected _step: Rand;\n\n /** Creates a new Drunk instance. Alternative form of `new Drunk(opts)`. */\n static drunk(opts?: DrunkOptions) {\n return new Drunk(opts);\n }\n\n constructor(opts?: DrunkOptions) {\n const { min, max, step, startsAt } = parseOptions(opts);\n\n this._initialValue = new Rand({ min, max });\n this._step = new Rand({ min: -1, max: 1 });\n\n const initialValue =\n typeof opts?.startsAt !== 'undefined' ? startsAt : this._initialValue.value();\n\n this.state = {\n initialValue,\n max,\n min,\n step,\n value: initialValue,\n };\n }\n\n /** Updates the walk bounds, clamping the current value if needed. */\n setRange(partialOpts?: Pick<DrunkOptions, 'min' | 'max'>) {\n const { max, min } = {\n min: this.state.min,\n max: this.state.max,\n ...partialOpts,\n };\n\n this._initialValue.setRange({ min, max });\n this.state = {\n ...this.state,\n ...(min !== this.state.min || max !== this.state.max\n ? {\n initialValue: clamp(this._initialValue.value(), min, max),\n max,\n min,\n value: clamp(this.state.value, min, max),\n }\n : {\n max,\n min,\n }),\n };\n }\n\n /** Updates the maximum step size. */\n setStepSize(partialOpts?: Pick<DrunkOptions, 'step'>) {\n const step = parseStepSize(partialOpts?.step);\n\n this.state = {\n ...this.state,\n step,\n };\n }\n\n /** Resets the walk with optional new options. */\n reset(opts?: DrunkOptions) {\n const { min, max, startsAt, step } = parseOptions(opts);\n\n this.setRange({ min, max });\n this.setStepSize({ step });\n\n const initialValue =\n typeof opts?.startsAt !== 'undefined' ? startsAt : this._initialValue.next();\n\n this.state = {\n ...this.state,\n initialValue,\n value: initialValue,\n };\n }\n\n /** Returns the current value. */\n value() {\n return this.state.value;\n }\n\n /** Advances one step and returns the new value. */\n next() {\n const { min, max, step, value } = this.state;\n const updates = clamp(value + max * this._step.next() * step, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Stochastic random walk generator that produces values within a bounded range.\n * Alternative form of `new Drunk(opts)`.\n */\nexport const drunk = Drunk.drunk;\n","type InnerNow = () => number;\n\n/** Resolve the best available clock once at module load. */\nconst innerNow = ((): InnerNow => {\n // Browser or modern Node (>= 16)\n if (typeof performance !== 'undefined' && 'now' in performance) {\n return () => performance.now();\n }\n\n // Older Node — use process.hrtime, offset from first call\n if (typeof process === 'object' && process.toString() === '[object process]') {\n const ts = () => {\n const hr = process.hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n const initialNow = ts();\n return () => (ts() - initialNow) / 1e6;\n }\n\n // Fallback — Date.now with manual offset\n const initialNow = Date.now();\n return () => Date.now() - initialNow;\n})();\n\n/**\n * Cross-environment high-resolution timestamp (performance.now polyfill).\n * @returns Elapsed milliseconds since initialization.\n */\nexport function now(): number {\n return innerNow();\n}\n","import { clamp } from './clamp';\n\n/** A numeric range with min and max bounds. */\nexport type ScaleRange = {\n min?: number;\n max: number;\n};\n\n/** Options for configuring a Scale mapper. */\nexport type ScaleOptions = {\n /** Input range. Defaults to { min: 0, max: 1 }. */\n from?: ScaleRange;\n /** Output range. Defaults to { min: 0, max: 1 }. */\n to?: ScaleRange;\n};\n\n/** Snapshot of a Scale mapper's internal state. */\nexport type ScaleState = {\n /** Input range. */\n from: Required<ScaleRange>;\n /** Precomputed (to.max - to.min) / (from.max - from.min), updated when ranges change. */\n ratio: number;\n /** Output range. */\n to: Required<ScaleRange>;\n /** Last scaled value. */\n value: number;\n};\n\n/** Precompute the scale factor so the hot path avoids a division per call. */\nconst computeRatio = (from: Required<ScaleRange>, to: Required<ScaleRange>) =>\n (to.max - to.min) / (from.max - from.min);\n\n/** Build initial state from options, applying defaults and computing the ratio. */\nexport const parseInitialState = (opts?: ScaleOptions): ScaleState => {\n const initialRange: Pick<ScaleState, 'from' | 'to'> = {\n from: {\n min: 0,\n max: 1,\n ...opts?.from,\n },\n to: {\n min: 0,\n max: 1,\n ...opts?.to,\n },\n };\n\n return {\n ...initialRange,\n ratio: computeRatio(initialRange.from, initialRange.to),\n value: initialRange.to.min,\n };\n};\n\n/** Merge partial range updates into existing state, recomputing the ratio. */\nexport const updateStateFromOptions = (opts: ScaleOptions, prevState: ScaleState): ScaleState => {\n const { from, to } = opts;\n const updatedFrom: Required<ScaleRange> = {\n ...prevState.from,\n ...from,\n };\n const updatedTo: Required<ScaleRange> = {\n ...prevState.to,\n ...to,\n };\n\n return {\n ...prevState,\n from: updatedFrom,\n ratio: computeRatio(updatedFrom, updatedTo),\n to: updatedTo,\n value: clamp(prevState.value, updatedTo.min, updatedTo.max),\n };\n};\n\n/**\n * Linear map of values from one range to another, supports negative values and inversion.\n * @param opts - {@link ScaleOptions} for configuring input and output ranges.\n */\nexport class Scale {\n state: ScaleState;\n\n /** Scales a single value. One-off form of `new Scale(opts).scale(n)`. */\n static scale(n: number, opts?: ScaleOptions) {\n return new Scale(opts).scale(n);\n }\n\n constructor(opts?: ScaleOptions) {\n this.state = parseInitialState(opts);\n }\n\n /** Updates input and/or output ranges, recomputing the internal ratio. */\n setRanges(opts: ScaleOptions) {\n this.state = updateStateFromOptions(opts, this.state);\n }\n\n /** Resets with new range options. */\n reset(opts: ScaleOptions) {\n this.state = parseInitialState(opts);\n }\n\n /** Returns the last scaled value. */\n value() {\n return this.state.value;\n }\n\n /** Maps a value from the input range to the output range. */\n scale(n: number) {\n const { from, to, ratio } = this.state;\n const updates = to.min + (clamp(n, from.min, from.max) - from.min) * ratio;\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Linear map of values from one range to another, supports negative values and inversion.\n * One-off form of `new Scale(opts).scale(n)`.\n */\nexport const scale = Scale.scale;\n","import { now } from './now';\nimport { Scale } from './scale';\n\n/** Snapshot of an Env's internal state. */\nexport type EnvState = {\n duration: number;\n from: number;\n prev: number;\n to: number;\n totalElapsed: number;\n value: number;\n};\n\n/** Options for configuring an Env envelope. */\nexport type EnvOptions = {\n /** Duration of the envelope in milliseconds. */\n duration: number;\n /** Starting value. Defaults to 0. */\n from?: number;\n /** Ending value. Defaults to 1. */\n to?: number;\n};\n\nexport const parseOptions = (opts?: EnvOptions): Required<EnvOptions> => {\n return {\n duration: 0,\n from: 0,\n to: 1,\n ...opts,\n };\n};\n\nconst getInitialState = ({ from, to, duration }: Required<EnvOptions>): EnvState => {\n return {\n duration,\n from,\n prev: now(),\n to,\n totalElapsed: 0,\n value: from,\n };\n};\n\nexport const updateStateFromOptions = (\n opts: EnvOptions | undefined,\n prevState: EnvState\n): EnvState => {\n const { from, to, duration } = {\n ...prevState,\n ...opts,\n };\n\n return {\n ...prevState,\n duration,\n from,\n to,\n totalElapsed: 0,\n };\n};\n\n/**\n * Linear envelope which interpolates between two values over a duration. Useful for audio envelopes, transitions, and animations.\n * @param opts - {@link EnvOptions} for configuring the envelope.\n */\nexport class Env {\n state: EnvState;\n protected _interpolator: Scale;\n\n /** Creates a new Env instance. Alternative form of `new Env(opts)`. */\n static env(opts: EnvOptions) {\n return new Env(opts);\n }\n\n constructor(opts: EnvOptions) {\n const { from, to, duration } = parseOptions(opts);\n\n this.state = getInitialState({ from, to, duration });\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: from,\n max: to,\n },\n });\n }\n\n /** Updates the envelope duration. */\n setDuration(duration: number) {\n const { to, totalElapsed } = this.state;\n\n this.state = {\n ...this.state,\n ...(duration <= totalElapsed\n ? {\n duration,\n value: to,\n }\n : { duration }),\n };\n }\n\n /** Restarts the envelope with optional new options. */\n reset(opts?: EnvOptions) {\n const updates = updateStateFromOptions(opts, this.state);\n\n this.state = {\n ...updates,\n prev: now(),\n value: updates.from,\n };\n this._interpolator.setRanges({\n from: {\n min: 0,\n max: updates.duration,\n },\n to: {\n min: updates.from,\n max: updates.to,\n },\n });\n }\n\n /** Returns true when the envelope has completed. */\n done() {\n return this.state.duration <= this.state.totalElapsed;\n }\n\n /** Returns the current interpolated value. */\n value() {\n const { to, value } = this.state;\n\n if (this.done()) {\n return to;\n }\n\n return value;\n }\n\n /** Advances the envelope and returns the new value. */\n next() {\n if (this.done()) {\n return this.value();\n }\n\n const { prev, totalElapsed: prevTotalElapsed } = this.state;\n\n const curr = now();\n const tickInterval = curr - prev;\n const totalElapsed = prevTotalElapsed + tickInterval;\n const updates = this._interpolator.scale(totalElapsed);\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Linear envelope which interpolates between two values over a duration. Useful for audio envelopes, transitions, and animations.\n * Alternative form of `new Env(opts)`.\n */\nexport const env = Env.env;\n","import { clamp } from './clamp';\n\n/** Options for configuring a Fold transformer. */\nexport type FoldOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Fold transformer's internal state. */\nexport type FoldState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: FoldOptions): Required<FoldOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Folds (reflects) values back and forth within a configured range.\n * @param opts - {@link FoldOptions} for configuring the range.\n */\nexport class Fold {\n state: FoldState;\n\n /** Folds a single value. One-off form of `new Fold(opts).fold(n)`. */\n static fold(n: number, opts?: FoldOptions) {\n return new Fold(opts).fold(n);\n }\n\n constructor(opts?: FoldOptions) {\n const { min, max } = parseOptions(opts);\n this.state = { min, max, value: min };\n }\n\n /** Updates the range bounds, folding the current value into the new range. */\n setRange(partialOpts: FoldOptions) {\n const { min, max } = { ...this.state, ...partialOpts };\n\n this.state = {\n ...this.state,\n min,\n max,\n value: transform(this.state.value, min, max),\n };\n }\n\n /** Returns the last folded value. */\n value() {\n return this.state.value;\n }\n\n /** Folds a value into the configured range and caches the result. */\n fold(n: number) {\n const { min, max } = this.state;\n const updates = transform(n, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Folds (reflects) values back and forth within a configured range.\n * One-off form of `new Fold(opts).fold(n)`.\n */\nexport const fold = Fold.fold;\n\n/**\n * Folds (reflects) a value back and forth within a range.\n * @param n - The input value.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The folded value within [min, max].\n */\nexport function transform(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n const range = hi - lo;\n\n if (range === 0) return lo;\n\n const period = range * 2;\n const offset = n - lo;\n\n // Normalize into one full bounce cycle [0, period)\n const normalized = ((offset % period) + period) % period;\n\n // First half travels forward, second half reflects back\n const value = normalized <= range ? lo + normalized : lo + period - normalized;\n\n return clamp(value, lo, hi);\n}\n","import { clamp } from './clamp';\nimport { now } from './now';\nimport { Scale } from './scale';\n\nexport const SINE_PERIOD = Math.PI * 2 - 0.0001;\n\n/** Options for configuring a Sine oscillator. */\nexport type SineOptions = {\n /** Duration of one full cycle in milliseconds. */\n duration: number;\n};\n\n/** Snapshot of a Sine oscillator's internal state. */\nexport type SineState = {\n cycle: number;\n duration: number;\n prev: number;\n totalElapsed: number;\n value: number;\n};\n\nconst getInitialState = (duration: number): SineState => ({\n cycle: 0,\n duration,\n prev: now(),\n totalElapsed: 0,\n value: 0,\n});\n\n/**\n * Time-based sine wave oscillator that outputs values between -1 and 1.\n * @param opts - {@link SineOptions} for configuring the oscillator.\n */\nexport class Sine {\n state: SineState;\n protected _interpolator: Scale;\n\n /** Creates a new Sine instance. Alternative form of `new Sine(opts)`. */\n static sine(opts: SineOptions) {\n return new Sine(opts);\n }\n\n constructor(opts: SineOptions) {\n const { duration } = opts;\n\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: 0,\n max: SINE_PERIOD,\n },\n });\n this.state = getInitialState(duration);\n }\n\n /** Updates the cycle duration. */\n setDuration(duration: number) {\n this.state = {\n ...this.state,\n duration,\n };\n }\n\n /** Resets the oscillator with optional new options. */\n reset(opts?: SineOptions) {\n const { duration } = {\n ...this.state,\n ...opts,\n };\n\n this.state = getInitialState(duration);\n }\n\n /** Returns the current oscillator value. */\n value() {\n return this.state.value;\n }\n\n /** Advances the oscillator and returns the new value. */\n next() {\n const { cycle, duration, prev, totalElapsed: prevTotalElapsed } = this.state;\n const curr = now();\n const tickInterval = curr - prev;\n const totalElapsed = prevTotalElapsed + tickInterval;\n\n const updates = clamp(Math.sin(this._interpolator.scale(totalElapsed)), -1, 1);\n\n if (cycle >= duration) {\n this.state.cycle = 0;\n } else {\n this.state.cycle = cycle + tickInterval;\n }\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Time-based sine wave oscillator that outputs values between -1 and 1.\n * Alternative form of `new Sine(opts)`.\n */\nexport const sine = Sine.sine;\n","/** Options for configuring a Wrap transformer. */\nexport type WrapOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Wrap transformer's internal state. */\nexport type WrapState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: WrapOptions): Required<WrapOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Wraps values around a configured range using modular arithmetic.\n * @param opts - {@link WrapOptions} for configuring the range.\n */\nexport class Wrap {\n state: WrapState;\n\n /** Wraps a single value. One-off form of `new Wrap(opts).wrap(n)`. */\n static wrap(n: number, opts?: WrapOptions) {\n return new Wrap(opts).wrap(n);\n }\n\n constructor(opts?: WrapOptions) {\n const { min, max } = parseOptions(opts);\n\n this.state = { min, max, value: min };\n }\n\n /** Updates the range bounds, wrapping the current value into the new range. */\n setRange(partialOpts: WrapOptions) {\n const { min, max } = {\n ...this.state,\n ...partialOpts,\n };\n\n this.state = {\n ...this.state,\n min,\n max,\n value: transform(this.state.value, min, max),\n };\n }\n\n /** Returns the last wrapped value. */\n value() {\n return this.state.value;\n }\n\n /** Wraps a value into the configured range and caches the result. */\n wrap(n: number) {\n const { min, max } = this.state;\n const updates = transform(n, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Wraps values around a configured range using modular arithmetic.\n * One-off form of `new Wrap(opts).wrap(n)`.\n */\nexport const wrap = Wrap.wrap;\n\n/**\n * Wraps a value around a range using modular arithmetic.\n * @param n - The input value.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The wrapped value within the range.\n */\nexport function transform(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n const lo = Math.min(a, b);\n const range = Math.max(a, b) - lo;\n\n if (range === 0) return lo;\n\n const offset = n - lo;\n\n return lo + (((offset % range) + range) % range);\n}\n","export const SIXTY_FPS = 1000 / 60;\nexport const MS_IN_SECOND = 1000;\nexport const MS_IN_MINUTE = 60 * MS_IN_SECOND;\nexport const MS_IN_HOUR = MS_IN_MINUTE * 60;\n","import { SIXTY_FPS } from './constants';\nimport { now } from './now';\n\n/** Snapshot of a running timer's internal state. */\nexport type TimerState = {\n initialTime: number;\n isRunning: boolean;\n iterations: number;\n prev: number;\n tickInterval: number;\n time: number;\n totalElapsed: number;\n};\n\nexport const getInitialState = (initialTime: number): TimerState => {\n return {\n initialTime,\n isRunning: false,\n iterations: -1,\n prev: 0,\n tickInterval: 0,\n time: initialTime,\n totalElapsed: 0,\n };\n};\n\nexport const processTimerState = (state: TimerState): TimerState | null => {\n const { time, prev, totalElapsed, iterations } = state;\n const curr = now();\n\n if (iterations === -1) {\n return {\n ...state,\n prev: curr,\n iterations: 0,\n };\n }\n\n const tickInterval = curr - prev;\n\n if (tickInterval <= time) {\n return null;\n }\n\n return {\n ...state,\n iterations: iterations + 1,\n prev: curr,\n tickInterval,\n totalElapsed: totalElapsed + tickInterval,\n };\n};\n\n/** Options for configuring a Metro timer. */\nexport type MetroOptions = {\n /** Interval between ticks in milliseconds. Defaults to ~16.67ms (60fps). */\n time?: number;\n};\n\nexport const parseOptions = (opts?: MetroOptions): Required<MetroOptions> => {\n return {\n time: SIXTY_FPS,\n ...opts,\n };\n};\n\n/** Callback invoked on each timer tick with the timer instance. */\nexport type TimerCallback<T extends Metro> = (timer: T) => void;\n\n/**\n * High-resolution recursive timer with variable interval, provides runtime metrics via callback for time-based calculations.\n * @param callback - {@link TimerCallback} called on each tick with the timer instance.\n * @param opts - {@link MetroOptions} for configuring the timer interval.\n */\nexport class Metro {\n state: TimerState;\n protected _listeners: TimerCallback<Metro>[];\n declare protected _timerId: ReturnType<typeof setTimeout> | number;\n\n /** Creates a new Metro instance. Alternative form of `new Metro(callback, opts)`. */\n static metro(callback: TimerCallback<Metro>, opts?: MetroOptions) {\n return new Metro(callback, opts);\n }\n\n constructor(callback: TimerCallback<Metro>, opts?: MetroOptions) {\n const { time } = parseOptions(opts);\n this.state = getInitialState(time);\n this._listeners = [callback];\n }\n\n protected asyncHandler(callback: () => void) {\n this._timerId = setTimeout(callback, SIXTY_FPS);\n }\n\n protected clearAsyncHandler() {\n clearTimeout(this._timerId);\n }\n\n /** Stops the timer and returns total elapsed time in milliseconds. */\n stop = () => {\n const { totalElapsed } = this.state;\n this.reset();\n this.clearAsyncHandler();\n\n return totalElapsed;\n };\n\n /** Resets state to initial values. */\n reset = () => {\n const { initialTime } = this.state;\n this.state = getInitialState(initialTime);\n };\n\n /** Updates the tick interval in milliseconds. */\n setTime = (updatedTime = this.state.time) => {\n const time = Math.max(updatedTime, 0);\n\n this.state = {\n ...this.state,\n time,\n initialTime: time,\n };\n };\n\n /** Starts the timer loop. */\n run = () => {\n if (this.state.isRunning) {\n this.stop();\n }\n\n this.state = {\n ...this.state,\n isRunning: true,\n prev: now(),\n };\n\n const tick = () => {\n const updates = processTimerState(this.state);\n\n if (updates) {\n this.state = updates;\n this._listeners.forEach((listener) => {\n listener(this);\n });\n }\n\n if (this.state.isRunning) {\n this.asyncHandler(tick);\n }\n };\n\n tick();\n };\n}\n\n/**\n * High-resolution recursive timer with variable interval, provides runtime metrics via callback for time-based calculations.\n * Alternative form of `new Metro(callback, opts)`.\n */\nexport const metro = Metro.metro;\n","import { MS_IN_SECOND, MS_IN_MINUTE, MS_IN_HOUR } from './constants';\n\nexport type FPS = 15 | 30 | 60;\n\nexport enum TimeFormat {\n FPS = 'fps',\n HOURS = 'h',\n HZ = 'hz',\n MILLISECONDS = 'ms',\n MINUTES = 'm',\n SECONDS = 's',\n}\n\nexport type AvailableTimeFormats = `${TimeFormat}`;\n\nexport const FORMAT_IDENTIFIERS: AvailableTimeFormats[] = [\n TimeFormat.FPS,\n TimeFormat.HOURS,\n TimeFormat.HZ,\n TimeFormat.MILLISECONDS,\n TimeFormat.MINUTES,\n TimeFormat.SECONDS,\n]\n // Desc length sort so that `ms` matches prior to `m`\n .sort((a, b) => b.length - a.length);\n\ntype FormatGetter = (val: number) => number;\n\nconst FORMATTERS = new Map<AvailableTimeFormats, FormatGetter>([\n [TimeFormat.FPS, (val: number) => MS_IN_SECOND / val],\n [TimeFormat.HOURS, (val: number) => val * MS_IN_HOUR],\n [TimeFormat.HZ, (val: number) => (1 / val) * MS_IN_SECOND],\n [TimeFormat.MILLISECONDS, (val: number) => val],\n [TimeFormat.MINUTES, (val: number) => val * MS_IN_MINUTE],\n [TimeFormat.SECONDS, (val: number) => val * MS_IN_SECOND],\n]);\n\nconst sanitizeStringVal = (val: string) => val.toLocaleLowerCase().trim();\n\nconst parseStringValAndFormat = (val: string) => {\n for (let i = 0; i < FORMAT_IDENTIFIERS.length; i += 1) {\n const format = FORMAT_IDENTIFIERS[i];\n\n if (val.includes(format)) {\n const value = Number(val.replace(' ', '').replace(format, ''));\n\n return {\n format,\n value,\n };\n }\n }\n\n return {\n format: undefined,\n value: undefined,\n };\n};\n\nexport function ms(val: string | null | undefined): number | undefined;\nexport function ms(\n val: string | number | null | undefined,\n format?: AvailableTimeFormats | TimeFormat\n): number | undefined;\n\n/**\n * Converts time format strings or numeric values to their corresponding value in milliseconds.\n * @param val - A string like `'60fps'`, `'2s'`, or a numeric value.\n * @param format - Explicit time format when `val` is a number.\n * @returns Milliseconds, or undefined if the input is invalid.\n */\nexport function ms(\n val: string | number | null | undefined,\n format?: AvailableTimeFormats | TimeFormat\n): number | undefined {\n let parsedValue: number | null | undefined = null;\n let parsedFormat: AvailableTimeFormats = format || TimeFormat.MILLISECONDS;\n\n if (typeof val === 'string') {\n const parsed = parseStringValAndFormat(sanitizeStringVal(val));\n\n if (typeof parsed.value !== 'undefined') {\n parsedValue = parsed.value;\n }\n\n if (parsed.format) {\n parsedFormat = parsed.format;\n }\n } else {\n parsedValue = val;\n }\n\n if (typeof parsedValue === 'undefined' || parsedValue === null || Number.isNaN(parsedValue)) {\n return undefined;\n }\n\n const formatter = FORMATTERS.get(parsedFormat);\n\n if (!formatter) {\n return undefined;\n }\n\n return formatter(parsedValue);\n}\n","import { Metro, type TimerCallback, type MetroOptions } from './metro';\nimport { ms, TimeFormat, type FPS } from './ms';\n\n/** Options for configuring a Frames timer. */\nexport type FramesOptions = {\n /** Target frames per second (15, 30, or 60). Defaults to 60. */\n fps: FPS;\n};\n\nexport const DEFAULT_FPS: FPS = 60;\n\nexport const parseOptions = (opts?: FramesOptions): MetroOptions => {\n const { fps } = {\n fps: DEFAULT_FPS,\n ...opts,\n };\n\n return {\n time: ms(fps, TimeFormat.FPS),\n };\n};\n\n/**\n * Animation-loop timer that uses requestAnimationFrame when available.\n * @param callback - {@link TimerCallback} called on each frame tick.\n * @param opts - {@link FramesOptions} for configuring the target frame rate.\n */\nexport class Frames extends Metro {\n declare protected _timerId: ReturnType<typeof requestAnimationFrame>;\n\n /** Creates a new Frames instance. Alternative form of `new Frames(callback, opts)`. */\n static frames(callback: TimerCallback<Frames>, opts?: FramesOptions) {\n return new Frames(callback, opts);\n }\n\n constructor(callback: TimerCallback<Frames>, opts?: FramesOptions) {\n super(() => callback(this), parseOptions(opts));\n }\n\n protected asyncHandler(callback: () => void) {\n if (typeof window === 'undefined' || !('requestAnimationFrame' in window)) {\n super.asyncHandler(callback);\n } else {\n this._timerId = requestAnimationFrame(callback);\n }\n }\n\n protected clearAsyncHandler() {\n if (typeof window === 'undefined' || !('cancelAnimationFrame' in window)) {\n super.clearAsyncHandler();\n } else {\n cancelAnimationFrame(this._timerId);\n }\n }\n\n /** Updates the target frames per second. */\n setFPS = (fps = DEFAULT_FPS) => {\n this.setTime(ms(fps, TimeFormat.FPS));\n };\n}\n\n/**\n * Animation-loop timer that uses requestAnimationFrame when available.\n * Alternative form of `new Frames(callback, opts)`.\n */\nexport const frames = Frames.frames;\n","import { clamp } from './clamp';\n\n/**\n * Scales 0...1 by Euler's number to produce a natural feeling curve.\n * @param n - Input value (clamped to 0-1).\n * @returns The exponentially scaled value.\n */\nexport function expo(n: number): number {\n return Math.pow(clamp(n, 0, 1), Math.E);\n}\n","import { clamp } from './clamp';\n\nfunction logistic(v: number, k: number): number {\n return 1 / (1 + Math.exp(-k * (v - 0.5)));\n}\n\n/**\n * A normalized sigmoid curve which maps 0...1 → 0...1 for use as a transfer function or waveshaper.\n *\n * The steepness parameter `k` controls the shape — higher values produce a\n * more aggressive S-curve, while k = 0 it's linear.\n * @param n - Input value (clamped to 0...1).\n * @param k - Steepness of the curve (default 5).\n * @returns The shaped value.\n */\nexport function sigmoid(n: number, k = 5): number {\n const x = clamp(n, 0, 1);\n if (k === 0) return x;\n\n const f0 = logistic(0, k);\n\n return (logistic(x, k) - f0) / (logistic(1, k) - f0);\n}\n","import { clamp } from './clamp';\n\n/**\n * A normalized tanh curve which maps -1...1 → -1...1 for use as a transfer function or waveshaper.\n *\n * The steepness parameter `k` controls saturation — higher values push the\n * curve toward hard clipping at the edges, while at k = 0 it's linear.\n * @param n - Input value (clamped to -1...1).\n * @param k - Steepness of the curve (default 5).\n * @returns The shaped value.\n */\nexport function tanh(n: number, k = 5): number {\n const x = clamp(n, -1, 1);\n if (k === 0) return x;\n\n return Math.tanh(k * x) / Math.tanh(k);\n}\n","/**\n * Promisified setTimeout.\n * @param time - Delay in milliseconds.\n * @returns A promise that resolves after the delay.\n */\nexport function wait(time: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, time));\n}\n"],"mappings":"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","names":["parseOptions","initialNow","parseOptions","updateStateFromOptions","parseOptions","getInitialState","parseOptions","transform","getInitialState","parseOptions","TimeFormat","parseOptions"]}
|
|
1
|
+
{"version":3,"sources":["../src/clamp.ts","../src/rand.ts","../src/drunk.ts","../src/now.ts","../src/scale.ts","../src/env.ts","../src/fold.ts","../src/sine.ts","../src/slew.ts","../src/wrap.ts","../src/constants.ts","../src/metro.ts","../src/ms.ts","../src/frames.ts","../src/expo.ts","../src/sigmoid.ts","../src/tanh.ts","../src/wait.ts"],"sourcesContent":["export function clamp(n: number): number;\nexport function clamp(n: number, max: number): number;\nexport function clamp(n: number, min: number, max: number): number;\n\n/**\n * Constrains an input value to a min...max range.\n * @param n - The value to constrain.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The clamped value.\n */\nexport function clamp(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n return Math.min(Math.max(n, a), b);\n}\n","import { clamp } from './clamp';\n\n/** Options for configuring a Rand generator. */\nexport type RandOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Rand generator's internal state. */\nexport type RandState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: RandOptions): Required<RandOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Random number generator that produces values within a bounded range.\n * @param opts - {@link RandOptions} for configuring the range.\n */\nexport class Rand {\n state: RandState;\n\n /** Returns a single random value. One-off form of `new Rand(opts).value()`. */\n static rand(opts?: RandOptions) {\n return new Rand(opts).value();\n }\n\n constructor(opts?: RandOptions) {\n const { min, max } = parseOptions(opts);\n\n this.state = { max, min, value: 0 };\n this.next();\n }\n\n /** Updates the range bounds, clamping the current value if needed. */\n setRange(partialOpts: RandOptions) {\n const { value = 0 } = this.state;\n const { min, max } = {\n ...this.state,\n ...partialOpts,\n };\n\n this.state = {\n ...this.state,\n max,\n min,\n value: clamp(value, min, max),\n };\n }\n\n /** Returns the current value. */\n value() {\n return this.state.value;\n }\n\n /** Generates a new random value within the range. */\n next() {\n const { min, max } = this.state;\n const updates = Math.random() * (max - min) + min;\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Random number generator that produces values within a bounded range.\n * One-off form of `new Rand(opts).value()`.\n */\nexport const rand = Rand.rand;\n","import { clamp } from './clamp';\nimport { Rand } from './rand';\n\nexport const DEFAULT_DRUNK_STEP = 0.1;\n\n/** Options for configuring a Drunk random walk. */\nexport type DrunkOptions = {\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Initial value. If omitted, a random value within the range is used. */\n startsAt?: number;\n /** Maximum step size as a fraction of the range (0-1). Defaults to 0.1. */\n step?: number;\n};\n\n/** Snapshot of a Drunk walk's internal state. */\nexport type DrunkState = {\n initialValue: number;\n max: number;\n min: number;\n step: number;\n value: number;\n};\n\nexport const parseStepSize = (step?: number): number =>\n typeof step !== 'undefined' ? clamp(step, 0, 1) : DEFAULT_DRUNK_STEP;\n\nexport const parseOptions = (opts?: DrunkOptions): Required<DrunkOptions> => {\n const { step, ...restOpts } = opts || {};\n const parsedStepSize = parseStepSize(step);\n\n return {\n max: 1,\n min: 0,\n startsAt: 0,\n step: parsedStepSize,\n ...restOpts,\n };\n};\n\n/**\n * Stochastic random walk generator that produces values within a bounded range.\n * @param opts - {@link DrunkOptions} for configuring the walk.\n */\nexport class Drunk {\n state: DrunkState;\n protected _initialValue: Rand;\n protected _step: Rand;\n\n /** Creates a new Drunk instance. Alternative form of `new Drunk(opts)`. */\n static drunk(opts?: DrunkOptions) {\n return new Drunk(opts);\n }\n\n constructor(opts?: DrunkOptions) {\n const { min, max, step, startsAt } = parseOptions(opts);\n\n this._initialValue = new Rand({ min, max });\n this._step = new Rand({ min: -1, max: 1 });\n\n const initialValue =\n typeof opts?.startsAt !== 'undefined' ? startsAt : this._initialValue.value();\n\n this.state = {\n initialValue,\n max,\n min,\n step,\n value: initialValue,\n };\n }\n\n /** Updates the walk bounds, clamping the current value if needed. */\n setRange(partialOpts?: Pick<DrunkOptions, 'min' | 'max'>) {\n const { max, min } = {\n min: this.state.min,\n max: this.state.max,\n ...partialOpts,\n };\n\n this._initialValue.setRange({ min, max });\n this.state = {\n ...this.state,\n ...(min !== this.state.min || max !== this.state.max\n ? {\n initialValue: clamp(this._initialValue.value(), min, max),\n max,\n min,\n value: clamp(this.state.value, min, max),\n }\n : {\n max,\n min,\n }),\n };\n }\n\n /** Updates the maximum step size. */\n setStepSize(partialOpts?: Pick<DrunkOptions, 'step'>) {\n const step = parseStepSize(partialOpts?.step);\n\n this.state = {\n ...this.state,\n step,\n };\n }\n\n /** Resets the walk with optional new options. */\n reset(opts?: DrunkOptions) {\n const { min, max, startsAt, step } = parseOptions(opts);\n\n this.setRange({ min, max });\n this.setStepSize({ step });\n\n const initialValue =\n typeof opts?.startsAt !== 'undefined' ? startsAt : this._initialValue.next();\n\n this.state = {\n ...this.state,\n initialValue,\n value: initialValue,\n };\n }\n\n /** Returns the current value. */\n value() {\n return this.state.value;\n }\n\n /** Advances one step and returns the new value. */\n next() {\n const { min, max, step, value } = this.state;\n const updates = clamp(value + max * this._step.next() * step, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Stochastic random walk generator that produces values within a bounded range.\n * Alternative form of `new Drunk(opts)`.\n */\nexport const drunk = Drunk.drunk;\n","type InnerNow = () => number;\n\n/** Resolve the best available clock once at module load. */\nconst innerNow = ((): InnerNow => {\n // Browser or modern Node (>= 16)\n if (typeof performance !== 'undefined' && 'now' in performance) {\n return () => performance.now();\n }\n\n // Older Node — use process.hrtime, offset from first call\n if (typeof process === 'object' && process.toString() === '[object process]') {\n const ts = () => {\n const hr = process.hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n const initialNow = ts();\n return () => (ts() - initialNow) / 1e6;\n }\n\n // Fallback — Date.now with manual offset\n const initialNow = Date.now();\n return () => Date.now() - initialNow;\n})();\n\n/**\n * Cross-environment high-resolution timestamp (performance.now polyfill).\n * @returns Elapsed milliseconds since initialization.\n */\nexport function now(): number {\n return innerNow();\n}\n","import { clamp } from './clamp';\n\n/** A numeric range with min and max bounds. */\nexport type ScaleRange = {\n min?: number;\n max: number;\n};\n\n/** Options for configuring a Scale mapper. */\nexport type ScaleOptions = {\n /** Input range. Defaults to { min: 0, max: 1 }. */\n from?: ScaleRange;\n /** Output range. Defaults to { min: 0, max: 1 }. */\n to?: ScaleRange;\n};\n\n/** Snapshot of a Scale mapper's internal state. */\nexport type ScaleState = {\n /** Input range. */\n from: Required<ScaleRange>;\n /** Precomputed (to.max - to.min) / (from.max - from.min), updated when ranges change. */\n ratio: number;\n /** Output range. */\n to: Required<ScaleRange>;\n /** Last scaled value. */\n value: number;\n};\n\n/** Precompute the scale factor so the hot path avoids a division per call. */\nconst computeRatio = (from: Required<ScaleRange>, to: Required<ScaleRange>) =>\n (to.max - to.min) / (from.max - from.min);\n\n/** Build initial state from options, applying defaults and computing the ratio. */\nexport const parseInitialState = (opts?: ScaleOptions): ScaleState => {\n const initialRange: Pick<ScaleState, 'from' | 'to'> = {\n from: {\n min: 0,\n max: 1,\n ...opts?.from,\n },\n to: {\n min: 0,\n max: 1,\n ...opts?.to,\n },\n };\n\n return {\n ...initialRange,\n ratio: computeRatio(initialRange.from, initialRange.to),\n value: initialRange.to.min,\n };\n};\n\n/** Merge partial range updates into existing state, recomputing the ratio. */\nexport const updateStateFromOptions = (opts: ScaleOptions, prevState: ScaleState): ScaleState => {\n const { from, to } = opts;\n const updatedFrom: Required<ScaleRange> = {\n ...prevState.from,\n ...from,\n };\n const updatedTo: Required<ScaleRange> = {\n ...prevState.to,\n ...to,\n };\n\n return {\n ...prevState,\n from: updatedFrom,\n ratio: computeRatio(updatedFrom, updatedTo),\n to: updatedTo,\n value: clamp(prevState.value, updatedTo.min, updatedTo.max),\n };\n};\n\n/**\n * Linear map of values from one range to another, supports negative values and inversion.\n * @param opts - {@link ScaleOptions} for configuring input and output ranges.\n */\nexport class Scale {\n state: ScaleState;\n\n /** Creates a new Scale instance. Alternative form of `new Scale(opts)`. */\n static scale(opts?: ScaleOptions) {\n return new Scale(opts);\n }\n\n constructor(opts?: ScaleOptions) {\n this.state = parseInitialState(opts);\n }\n\n /** Updates input and/or output ranges, recomputing the internal ratio. */\n setRanges(opts: ScaleOptions) {\n this.state = updateStateFromOptions(opts, this.state);\n }\n\n /** Resets with new range options. */\n reset(opts: ScaleOptions) {\n this.state = parseInitialState(opts);\n }\n\n /** Returns the last scaled value. */\n value() {\n return this.state.value;\n }\n\n /** Maps a value from the input range to the output range. */\n scale(n: number) {\n const { from, to, ratio } = this.state;\n const updates = to.min + (clamp(n, from.min, from.max) - from.min) * ratio;\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Linear map of values from one range to another, supports negative values and inversion.\n * Alternative form of `new Scale(opts)`.\n */\nexport const scale = Scale.scale;\n","import { now } from './now';\nimport { Scale } from './scale';\n\n/** Snapshot of an Env's internal state. */\nexport type EnvState = {\n duration: number;\n from: number;\n prev: number;\n to: number;\n totalElapsed: number;\n value: number;\n};\n\n/** Options for configuring an Env envelope. */\nexport type EnvOptions = {\n /** Duration of the envelope in milliseconds. */\n duration: number;\n /** Starting value. Defaults to 0. */\n from?: number;\n /** Ending value. Defaults to 1. */\n to?: number;\n};\n\nexport const parseOptions = (opts?: EnvOptions): Required<EnvOptions> => {\n return {\n duration: 0,\n from: 0,\n to: 1,\n ...opts,\n };\n};\n\nconst getInitialState = ({ from, to, duration }: Required<EnvOptions>): EnvState => {\n return {\n duration,\n from,\n prev: now(),\n to,\n totalElapsed: 0,\n value: from,\n };\n};\n\nexport const updateStateFromOptions = (\n opts: EnvOptions | undefined,\n prevState: EnvState\n): EnvState => {\n const { from, to, duration } = {\n ...prevState,\n ...opts,\n };\n\n return {\n ...prevState,\n duration,\n from,\n to,\n totalElapsed: 0,\n };\n};\n\n/**\n * Linear envelope which interpolates between two values over a duration. Useful for audio envelopes, transitions, and animations.\n * @param opts - {@link EnvOptions} for configuring the envelope.\n */\nexport class Env {\n state: EnvState;\n protected _interpolator: Scale;\n\n /** Creates a new Env instance. Alternative form of `new Env(opts)`. */\n static env(opts: EnvOptions) {\n return new Env(opts);\n }\n\n constructor(opts: EnvOptions) {\n const { from, to, duration } = parseOptions(opts);\n\n this.state = getInitialState({ from, to, duration });\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: from,\n max: to,\n },\n });\n }\n\n /** Updates the envelope duration. */\n setDuration(duration: number) {\n const { to, totalElapsed } = this.state;\n\n this.state = {\n ...this.state,\n ...(duration <= totalElapsed\n ? {\n duration,\n value: to,\n }\n : { duration }),\n };\n }\n\n /** Restarts the envelope with optional new options. */\n reset(opts?: EnvOptions) {\n const updates = updateStateFromOptions(opts, this.state);\n\n this.state = {\n ...updates,\n prev: now(),\n value: updates.from,\n };\n this._interpolator.setRanges({\n from: {\n min: 0,\n max: updates.duration,\n },\n to: {\n min: updates.from,\n max: updates.to,\n },\n });\n }\n\n /** Returns true when the envelope has completed. */\n done() {\n return this.state.duration <= this.state.totalElapsed;\n }\n\n /** Returns the current interpolated value. */\n value() {\n const { to, value } = this.state;\n\n if (this.done()) {\n return to;\n }\n\n return value;\n }\n\n /** Advances the envelope and returns the new value. */\n next() {\n if (this.done()) {\n return this.value();\n }\n\n const { prev, totalElapsed: prevTotalElapsed } = this.state;\n\n const curr = now();\n const tickInterval = curr - prev;\n const totalElapsed = prevTotalElapsed + tickInterval;\n const updates = this._interpolator.scale(totalElapsed);\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Linear envelope which interpolates between two values over a duration. Useful for audio envelopes, transitions, and animations.\n * Alternative form of `new Env(opts)`.\n */\nexport const env = Env.env;\n","import { clamp } from './clamp';\n\n/** Options for configuring a Fold transformer. */\nexport type FoldOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Fold transformer's internal state. */\nexport type FoldState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: FoldOptions): Required<FoldOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Folds (reflects) values back and forth within a configured range.\n * @param opts - {@link FoldOptions} for configuring the range.\n */\nexport class Fold {\n state: FoldState;\n\n /** Creates a new Fold instance. Alternative form of `new Fold(opts)`. */\n static fold(opts?: FoldOptions) {\n return new Fold(opts);\n }\n\n constructor(opts?: FoldOptions) {\n const { min, max } = parseOptions(opts);\n this.state = { min, max, value: min };\n }\n\n /** Updates the range bounds, folding the current value into the new range. */\n setRange(partialOpts: FoldOptions) {\n const { min, max } = { ...this.state, ...partialOpts };\n\n this.state = {\n ...this.state,\n min,\n max,\n value: transform(this.state.value, min, max),\n };\n }\n\n /** Returns the last folded value. */\n value() {\n return this.state.value;\n }\n\n /** Folds a value into the configured range and caches the result. */\n fold(n: number) {\n const { min, max } = this.state;\n const updates = transform(n, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Folds (reflects) values back and forth within a configured range.\n * Alternative form of `new Fold(opts)`.\n */\nexport const fold = Fold.fold;\n\n/**\n * Folds (reflects) a value back and forth within a range.\n * @param n - The input value.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The folded value within [min, max].\n */\nexport function transform(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n const range = hi - lo;\n\n if (range === 0) return lo;\n\n const period = range * 2;\n const offset = n - lo;\n\n // Normalize into one full bounce cycle [0, period)\n const normalized = ((offset % period) + period) % period;\n\n // First half travels forward, second half reflects back\n const value = normalized <= range ? lo + normalized : lo + period - normalized;\n\n return clamp(value, lo, hi);\n}\n","import { clamp } from './clamp';\nimport { now } from './now';\nimport { Scale } from './scale';\n\nexport const SINE_PERIOD = Math.PI * 2 - 0.0001;\n\n/** Options for configuring a Sine oscillator. */\nexport type SineOptions = {\n /** Duration of one full cycle in milliseconds. */\n duration: number;\n};\n\n/** Snapshot of a Sine oscillator's internal state. */\nexport type SineState = {\n cycle: number;\n duration: number;\n prev: number;\n totalElapsed: number;\n value: number;\n};\n\nconst getInitialState = (duration: number): SineState => ({\n cycle: 0,\n duration,\n prev: now(),\n totalElapsed: 0,\n value: 0,\n});\n\n/**\n * Time-based sine wave oscillator that outputs values between -1 and 1.\n * @param opts - {@link SineOptions} for configuring the oscillator.\n */\nexport class Sine {\n state: SineState;\n protected _interpolator: Scale;\n\n /** Creates a new Sine instance. Alternative form of `new Sine(opts)`. */\n static sine(opts: SineOptions) {\n return new Sine(opts);\n }\n\n constructor(opts: SineOptions) {\n const { duration } = opts;\n\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: 0,\n max: SINE_PERIOD,\n },\n });\n this.state = getInitialState(duration);\n }\n\n /** Updates the cycle duration. */\n setDuration(duration: number) {\n this.state = {\n ...this.state,\n duration,\n };\n }\n\n /** Resets the oscillator with optional new options. */\n reset(opts?: SineOptions) {\n const { duration } = {\n ...this.state,\n ...opts,\n };\n\n this.state = getInitialState(duration);\n }\n\n /** Returns the current oscillator value. */\n value() {\n return this.state.value;\n }\n\n /** Advances the oscillator and returns the new value. */\n next() {\n const { cycle, duration, prev, totalElapsed: prevTotalElapsed } = this.state;\n const curr = now();\n const tickInterval = curr - prev;\n const totalElapsed = prevTotalElapsed + tickInterval;\n\n const updates = clamp(Math.sin(this._interpolator.scale(totalElapsed)), -1, 1);\n\n if (cycle >= duration) {\n this.state.cycle = 0;\n } else {\n this.state.cycle = cycle + tickInterval;\n }\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Time-based sine wave oscillator that outputs values between -1 and 1.\n * Alternative form of `new Sine(opts)`.\n */\nexport const sine = Sine.sine;\n","import { clamp } from './clamp';\nimport { now } from './now';\nimport { Scale } from './scale';\n\n/** Options for configuring a Slew processor. */\nexport type SlewOptions = {\n /** Duration of each transition in milliseconds. Defaults to 1000. */\n duration?: number;\n /** Initial value. Defaults to 0. */\n value?: number;\n};\n\n/** Snapshot of a Slew processor's internal state. */\nexport type SlewState = {\n duration: number;\n from: number;\n prev: number;\n to: number;\n totalElapsed: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: SlewOptions): Required<SlewOptions> => {\n return {\n duration: 1000,\n value: 0,\n ...opts,\n };\n};\n\nconst getInitialState = (duration: number, value: number): SlewState => {\n return {\n duration,\n from: value,\n prev: now(),\n to: value,\n totalElapsed: 0,\n value,\n };\n};\n\n/**\n * Continuous interpolation processor which transitions toward a target value over a fixed duration.\n * @param opts - {@link SlewOptions} for configuring duration and initial value.\n */\nexport class Slew {\n state: SlewState;\n protected _interpolator: Scale;\n\n /** Creates a new Slew instance. Alternative form of `new Slew(opts)`. */\n static slew(opts?: SlewOptions) {\n return new Slew(opts);\n }\n\n constructor(opts?: SlewOptions) {\n const { duration, value } = parseOptions(opts);\n\n this.state = getInitialState(duration, value);\n this._interpolator = new Scale({\n from: {\n min: 0,\n max: duration,\n },\n to: {\n min: value,\n max: value,\n },\n });\n }\n\n /** Returns true when the current value has reached the target. */\n done() {\n return this.state.from === this.state.to || this.state.duration <= this.state.totalElapsed;\n }\n\n /** Returns the current value. */\n value() {\n if (this.done()) {\n return this.state.to;\n }\n\n return this.state.value;\n }\n\n /** Sets a new target value, beginning a transition from the current position. */\n setValue(to: number) {\n const from = this.value();\n\n this.state = {\n ...this.state,\n from,\n to,\n prev: now(),\n totalElapsed: 0,\n };\n this._interpolator.setRanges({\n to: { min: from, max: to },\n });\n }\n\n /** Updates the transition duration in milliseconds. */\n setDuration(duration: number) {\n this.state.duration = Math.max(duration, 0);\n this._interpolator.setRanges({\n from: { min: 0, max: this.state.duration },\n });\n }\n\n /** Advances the processor and returns the current value. */\n next() {\n if (this.done()) {\n return this.value();\n }\n\n const { prev, totalElapsed: prevTotalElapsed, duration } = this.state;\n\n const curr = now();\n const totalElapsed = prevTotalElapsed + (curr - prev);\n const value = this._interpolator.scale(clamp(totalElapsed, 0, duration));\n\n this.state.prev = curr;\n this.state.totalElapsed = totalElapsed;\n this.state.value = value;\n\n return value;\n }\n}\n\n/**\n * Continuous interpolation processor which transitions toward a target value over a fixed duration.\n * Alternative form of `new Slew(opts)`.\n */\nexport const slew = Slew.slew;\n","/** Options for configuring a Wrap transformer. */\nexport type WrapOptions = {\n /** Lower bound of the range. Defaults to 0. */\n min?: number;\n /** Upper bound of the range. Defaults to 1. */\n max?: number;\n};\n\n/** Snapshot of a Wrap transformer's internal state. */\nexport type WrapState = {\n min: number;\n max: number;\n value: number;\n};\n\nexport const parseOptions = (opts?: WrapOptions): Required<WrapOptions> => {\n return {\n min: 0,\n max: 1,\n ...opts,\n };\n};\n\n/**\n * Wraps values around a configured range using modular arithmetic.\n * @param opts - {@link WrapOptions} for configuring the range.\n */\nexport class Wrap {\n state: WrapState;\n\n /** Creates a new Wrap instance. Alternative form of `new Wrap(opts)`. */\n static wrap(opts?: WrapOptions) {\n return new Wrap(opts);\n }\n\n constructor(opts?: WrapOptions) {\n const { min, max } = parseOptions(opts);\n\n this.state = { min, max, value: min };\n }\n\n /** Updates the range bounds, wrapping the current value into the new range. */\n setRange(partialOpts: WrapOptions) {\n const { min, max } = {\n ...this.state,\n ...partialOpts,\n };\n\n this.state = {\n ...this.state,\n min,\n max,\n value: transform(this.state.value, min, max),\n };\n }\n\n /** Returns the last wrapped value. */\n value() {\n return this.state.value;\n }\n\n /** Wraps a value into the configured range and caches the result. */\n wrap(n: number) {\n const { min, max } = this.state;\n const updates = transform(n, min, max);\n\n this.state.value = updates;\n\n return updates;\n }\n}\n\n/**\n * Wraps values around a configured range using modular arithmetic.\n * Alternative form of `new Wrap(opts)`.\n */\nexport const wrap = Wrap.wrap;\n\n/**\n * Wraps a value around a range using modular arithmetic.\n * @param n - The input value.\n * @param min - Lower bound (defaults to 0).\n * @param max - Upper bound (defaults to 1).\n * @returns The wrapped value within the range.\n */\nexport function transform(n: number, min?: number, max?: number) {\n let a = 0;\n let b = 1;\n\n if (typeof min === 'number') {\n if (typeof max === 'number') {\n a = min;\n b = max;\n } else {\n a = 0;\n b = min;\n }\n }\n\n const lo = Math.min(a, b);\n const range = Math.max(a, b) - lo;\n\n if (range === 0) return lo;\n\n const offset = n - lo;\n\n return lo + (((offset % range) + range) % range);\n}\n","export const SIXTY_FPS = 1000 / 60;\nexport const MS_IN_SECOND = 1000;\nexport const MS_IN_MINUTE = 60 * MS_IN_SECOND;\nexport const MS_IN_HOUR = MS_IN_MINUTE * 60;\n","import { SIXTY_FPS } from './constants';\nimport { now } from './now';\n\n/** Snapshot of a running timer's internal state. */\nexport type TimerState = {\n initialTime: number;\n isRunning: boolean;\n iterations: number;\n prev: number;\n tickInterval: number;\n time: number;\n totalElapsed: number;\n};\n\nexport const getInitialState = (initialTime: number): TimerState => {\n return {\n initialTime,\n isRunning: false,\n iterations: -1,\n prev: 0,\n tickInterval: 0,\n time: initialTime,\n totalElapsed: 0,\n };\n};\n\nexport const processTimerState = (state: TimerState): TimerState | null => {\n const { time, prev, totalElapsed, iterations } = state;\n const curr = now();\n\n if (iterations === -1) {\n return {\n ...state,\n prev: curr,\n iterations: 0,\n };\n }\n\n const tickInterval = curr - prev;\n\n if (tickInterval <= time) {\n return null;\n }\n\n return {\n ...state,\n iterations: iterations + 1,\n prev: curr,\n tickInterval,\n totalElapsed: totalElapsed + tickInterval,\n };\n};\n\n/** Options for configuring a Metro timer. */\nexport type MetroOptions = {\n /** Interval between ticks in milliseconds. Defaults to ~16.67ms (60fps). */\n time?: number;\n};\n\nexport const parseOptions = (opts?: MetroOptions): Required<MetroOptions> => {\n return {\n time: SIXTY_FPS,\n ...opts,\n };\n};\n\n/** Callback invoked on each timer tick with the timer instance. */\nexport type TimerCallback<T extends Metro> = (timer: T) => void;\n\n/**\n * High-resolution recursive timer with variable interval, provides runtime metrics via callback for time-based calculations.\n * @param callback - {@link TimerCallback} called on each tick with the timer instance.\n * @param opts - {@link MetroOptions} for configuring the timer interval.\n */\nexport class Metro {\n state: TimerState;\n protected _listeners: TimerCallback<Metro>[];\n declare protected _timerId: ReturnType<typeof setTimeout> | number;\n\n /** Creates a new Metro instance. Alternative form of `new Metro(callback, opts)`. */\n static metro(callback: TimerCallback<Metro>, opts?: MetroOptions) {\n return new Metro(callback, opts);\n }\n\n constructor(callback: TimerCallback<Metro>, opts?: MetroOptions) {\n const { time } = parseOptions(opts);\n this.state = getInitialState(time);\n this._listeners = [callback];\n }\n\n protected asyncHandler(callback: () => void) {\n this._timerId = setTimeout(callback, SIXTY_FPS);\n }\n\n protected clearAsyncHandler() {\n clearTimeout(this._timerId);\n }\n\n /** Stops the timer and returns total elapsed time in milliseconds. */\n stop = () => {\n const { totalElapsed } = this.state;\n this.reset();\n this.clearAsyncHandler();\n\n return totalElapsed;\n };\n\n /** Resets state to initial values. */\n reset = () => {\n const { initialTime } = this.state;\n this.state = getInitialState(initialTime);\n };\n\n /** Updates the tick interval in milliseconds. */\n setTime = (updatedTime = this.state.time) => {\n const time = Math.max(updatedTime, 0);\n\n this.state = {\n ...this.state,\n time,\n initialTime: time,\n };\n };\n\n /** Starts the timer loop. */\n run = () => {\n if (this.state.isRunning) {\n this.stop();\n }\n\n this.state = {\n ...this.state,\n isRunning: true,\n prev: now(),\n };\n\n const tick = () => {\n const updates = processTimerState(this.state);\n\n if (updates) {\n this.state = updates;\n this._listeners.forEach((listener) => {\n listener(this);\n });\n }\n\n if (this.state.isRunning) {\n this.asyncHandler(tick);\n }\n };\n\n tick();\n };\n}\n\n/**\n * High-resolution recursive timer with variable interval, provides runtime metrics via callback for time-based calculations.\n * Alternative form of `new Metro(callback, opts)`.\n */\nexport const metro = Metro.metro;\n","import { MS_IN_SECOND, MS_IN_MINUTE, MS_IN_HOUR } from './constants';\n\nexport type FPS = 15 | 30 | 60;\n\nexport enum TimeFormat {\n FPS = 'fps',\n HOURS = 'h',\n HZ = 'hz',\n MILLISECONDS = 'ms',\n MINUTES = 'm',\n SECONDS = 's',\n}\n\nexport type AvailableTimeFormats = `${TimeFormat}`;\n\nexport const FORMAT_IDENTIFIERS: AvailableTimeFormats[] = [\n TimeFormat.FPS,\n TimeFormat.HOURS,\n TimeFormat.HZ,\n TimeFormat.MILLISECONDS,\n TimeFormat.MINUTES,\n TimeFormat.SECONDS,\n]\n // Desc length sort so that `ms` matches prior to `m`\n .sort((a, b) => b.length - a.length);\n\ntype FormatGetter = (val: number) => number;\n\nconst FORMATTERS = new Map<AvailableTimeFormats, FormatGetter>([\n [TimeFormat.FPS, (val: number) => MS_IN_SECOND / val],\n [TimeFormat.HOURS, (val: number) => val * MS_IN_HOUR],\n [TimeFormat.HZ, (val: number) => (1 / val) * MS_IN_SECOND],\n [TimeFormat.MILLISECONDS, (val: number) => val],\n [TimeFormat.MINUTES, (val: number) => val * MS_IN_MINUTE],\n [TimeFormat.SECONDS, (val: number) => val * MS_IN_SECOND],\n]);\n\nconst sanitizeStringVal = (val: string) => val.toLocaleLowerCase().trim();\n\nconst parseStringValAndFormat = (val: string) => {\n for (let i = 0; i < FORMAT_IDENTIFIERS.length; i += 1) {\n const format = FORMAT_IDENTIFIERS[i];\n\n if (val.includes(format)) {\n const value = Number(val.replace(' ', '').replace(format, ''));\n\n return {\n format,\n value,\n };\n }\n }\n\n return {\n format: undefined,\n value: undefined,\n };\n};\n\nexport function ms(val: string | null | undefined): number | undefined;\nexport function ms(\n val: string | number | null | undefined,\n format?: AvailableTimeFormats | TimeFormat\n): number | undefined;\n\n/**\n * Converts time format strings or numeric values to their corresponding value in milliseconds.\n * @param val - A string like `'60fps'`, `'2s'`, or a numeric value.\n * @param format - Explicit time format when `val` is a number.\n * @returns Milliseconds, or undefined if the input is invalid.\n */\nexport function ms(\n val: string | number | null | undefined,\n format?: AvailableTimeFormats | TimeFormat\n): number | undefined {\n let parsedValue: number | null | undefined = null;\n let parsedFormat: AvailableTimeFormats = format || TimeFormat.MILLISECONDS;\n\n if (typeof val === 'string') {\n const parsed = parseStringValAndFormat(sanitizeStringVal(val));\n\n if (typeof parsed.value !== 'undefined') {\n parsedValue = parsed.value;\n }\n\n if (parsed.format) {\n parsedFormat = parsed.format;\n }\n } else {\n parsedValue = val;\n }\n\n if (typeof parsedValue === 'undefined' || parsedValue === null || Number.isNaN(parsedValue)) {\n return undefined;\n }\n\n const formatter = FORMATTERS.get(parsedFormat);\n\n if (!formatter) {\n return undefined;\n }\n\n return formatter(parsedValue);\n}\n","import { Metro, type TimerCallback, type MetroOptions } from './metro';\nimport { ms, TimeFormat, type FPS } from './ms';\n\n/** Options for configuring a Frames timer. */\nexport type FramesOptions = {\n /** Target frames per second (15, 30, or 60). Defaults to 60. */\n fps: FPS;\n};\n\nexport const DEFAULT_FPS: FPS = 60;\n\nexport const parseOptions = (opts?: FramesOptions): MetroOptions => {\n const { fps } = {\n fps: DEFAULT_FPS,\n ...opts,\n };\n\n return {\n time: ms(fps, TimeFormat.FPS),\n };\n};\n\n/**\n * Animation-loop timer that uses requestAnimationFrame when available.\n * @param callback - {@link TimerCallback} called on each frame tick.\n * @param opts - {@link FramesOptions} for configuring the target frame rate.\n */\nexport class Frames extends Metro {\n declare protected _timerId: ReturnType<typeof requestAnimationFrame>;\n\n /** Creates a new Frames instance. Alternative form of `new Frames(callback, opts)`. */\n static frames(callback: TimerCallback<Frames>, opts?: FramesOptions) {\n return new Frames(callback, opts);\n }\n\n constructor(callback: TimerCallback<Frames>, opts?: FramesOptions) {\n super(() => callback(this), parseOptions(opts));\n }\n\n protected asyncHandler(callback: () => void) {\n if (typeof window === 'undefined' || !('requestAnimationFrame' in window)) {\n super.asyncHandler(callback);\n } else {\n this._timerId = requestAnimationFrame(callback);\n }\n }\n\n protected clearAsyncHandler() {\n if (typeof window === 'undefined' || !('cancelAnimationFrame' in window)) {\n super.clearAsyncHandler();\n } else {\n cancelAnimationFrame(this._timerId);\n }\n }\n\n /** Updates the target frames per second. */\n setFPS = (fps = DEFAULT_FPS) => {\n this.setTime(ms(fps, TimeFormat.FPS));\n };\n}\n\n/**\n * Animation-loop timer that uses requestAnimationFrame when available.\n * Alternative form of `new Frames(callback, opts)`.\n */\nexport const frames = Frames.frames;\n","import { clamp } from './clamp';\n\n/**\n * Scales 0...1 by Euler's number to produce a natural feeling curve.\n * @param n - Input value (clamped to 0-1).\n * @returns The exponentially scaled value.\n */\nexport function expo(n: number): number {\n return Math.pow(clamp(n, 0, 1), Math.E);\n}\n","import { clamp } from './clamp';\n\nfunction logistic(v: number, k: number): number {\n return 1 / (1 + Math.exp(-k * (v - 0.5)));\n}\n\n/**\n * A normalized sigmoid curve which maps 0...1 → 0...1 for use as a transfer function or waveshaper.\n *\n * The steepness parameter `k` controls the shape — higher values produce a\n * more aggressive S-curve, while k = 0 it's linear.\n * @param n - Input value (clamped to 0...1).\n * @param k - Steepness of the curve (default 5).\n * @returns The shaped value.\n */\nexport function sigmoid(n: number, k = 5): number {\n const x = clamp(n, 0, 1);\n if (k === 0) return x;\n\n const f0 = logistic(0, k);\n\n return (logistic(x, k) - f0) / (logistic(1, k) - f0);\n}\n","import { clamp } from './clamp';\n\n/**\n * A normalized tanh curve which maps -1...1 → -1...1 for use as a transfer function or waveshaper.\n *\n * The steepness parameter `k` controls saturation — higher values push the\n * curve toward hard clipping at the edges, while at k = 0 it's linear.\n * @param n - Input value (clamped to -1...1).\n * @param k - Steepness of the curve (default 5).\n * @returns The shaped value.\n */\nexport function tanh(n: number, k = 5): number {\n const x = clamp(n, -1, 1);\n if (k === 0) return x;\n\n return Math.tanh(k * x) / Math.tanh(k);\n}\n","/**\n * Promisified setTimeout.\n * @param time - Delay in milliseconds.\n * @returns A promise that resolves after the delay.\n */\nexport function wait(time: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, time));\n}\n"],"mappings":"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","names":["parseOptions","initialNow","parseOptions","updateStateFromOptions","parseOptions","getInitialState","parseOptions","getInitialState","parseOptions","transform","getInitialState","parseOptions","TimeFormat","parseOptions"]}
|