curvy 1.0.9 → 2.0.0-alpha.2

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.
Files changed (173) hide show
  1. package/dist/characteristic/index.d.mts +88 -0
  2. package/dist/characteristic/index.mjs +2 -0
  3. package/dist/curve/index.d.mts +2 -0
  4. package/dist/curve/index.mjs +2 -0
  5. package/dist/interval/index.d.mts +3 -0
  6. package/dist/interval/index.mjs +3 -0
  7. package/dist/matrix/index.d.mts +2 -0
  8. package/dist/matrix/index.mjs +267 -0
  9. package/dist/matrix/index.mjs.map +1 -0
  10. package/dist/number.d.mts +280 -0
  11. package/dist/number.mjs +140 -0
  12. package/dist/number.mjs.map +1 -0
  13. package/dist/path/index.d.mts +261 -0
  14. package/dist/path/index.mjs +325 -0
  15. package/dist/path/index.mjs.map +1 -0
  16. package/dist/polynomial/index.d.mts +2 -0
  17. package/dist/polynomial/index.mjs +3 -0
  18. package/dist/shared/characteristic-B9nCh_cx.mjs +104 -0
  19. package/dist/shared/characteristic-B9nCh_cx.mjs.map +1 -0
  20. package/dist/shared/chunk-25Hzd3z8.mjs +13 -0
  21. package/dist/shared/cubic-BajUY0JT.d.mts +1100 -0
  22. package/dist/shared/cubic-CpHAx8cC.mjs +479 -0
  23. package/dist/shared/cubic-CpHAx8cC.mjs.map +1 -0
  24. package/dist/shared/interval-05CR6eBf.mjs +421 -0
  25. package/dist/shared/interval-05CR6eBf.mjs.map +1 -0
  26. package/dist/shared/interval-Dy-RMEE3.d.mts +533 -0
  27. package/dist/shared/interval2d-8IBZnUOq.mjs +108 -0
  28. package/dist/shared/interval2d-8IBZnUOq.mjs.map +1 -0
  29. package/dist/shared/interval2d-C2id9u31.d.mts +172 -0
  30. package/dist/shared/matrix4x4-Ck2WROK-.mjs +440 -0
  31. package/dist/shared/matrix4x4-Ck2WROK-.mjs.map +1 -0
  32. package/dist/shared/matrix4x4-Dm_tSiH1.d.mts +1183 -0
  33. package/dist/shared/quadratic-CamozcFc.mjs +330 -0
  34. package/dist/shared/quadratic-CamozcFc.mjs.map +1 -0
  35. package/dist/shared/rationalCubic2d-B6g97ryJ.d.mts +308 -0
  36. package/dist/shared/rationalCubic2d-BEgUGSFf.mjs +295 -0
  37. package/dist/shared/rationalCubic2d-BEgUGSFf.mjs.map +1 -0
  38. package/dist/shared/rationalCubic2d-Bys2Uory.mjs +695 -0
  39. package/dist/shared/rationalCubic2d-Bys2Uory.mjs.map +1 -0
  40. package/dist/shared/rationalCubic2d-DlQfBURs.d.mts +818 -0
  41. package/dist/shared/solution-CrtLfqEq.mjs +306 -0
  42. package/dist/shared/solution-CrtLfqEq.mjs.map +1 -0
  43. package/dist/shared/solution-sNQ-ZVhN.d.mts +251 -0
  44. package/dist/{pipe.d.mts → shared/utils-MCckigYk.d.mts} +44 -26
  45. package/dist/shared/vector2-CL1HDdPr.mjs +187 -0
  46. package/dist/shared/vector2-CL1HDdPr.mjs.map +1 -0
  47. package/dist/shared/vector2-DPUY3_eA.d.mts +470 -0
  48. package/dist/shared/vector2.internal-DU_E808S.mjs +97 -0
  49. package/dist/shared/vector2.internal-DU_E808S.mjs.map +1 -0
  50. package/dist/shared/vector3-D-tv_aKL.mjs +204 -0
  51. package/dist/shared/vector3-D-tv_aKL.mjs.map +1 -0
  52. package/dist/shared/vector3-DqeOZtOB.d.mts +703 -0
  53. package/dist/shared/vector4-5KbjoHVj.mjs +109 -0
  54. package/dist/shared/vector4-5KbjoHVj.mjs.map +1 -0
  55. package/dist/shared/vector4.internal-5XcaX12X.mjs +163 -0
  56. package/dist/shared/vector4.internal-5XcaX12X.mjs.map +1 -0
  57. package/dist/solution/index.d.mts +2 -0
  58. package/dist/solution/index.mjs +2 -0
  59. package/dist/splines/index.d.mts +701 -0
  60. package/dist/splines/index.mjs +734 -0
  61. package/dist/splines/index.mjs.map +1 -0
  62. package/dist/utils.d.mts +2 -205
  63. package/dist/utils.mjs +88 -52
  64. package/dist/utils.mjs.map +1 -1
  65. package/dist/vector/index.d.mts +3 -0
  66. package/dist/vector/index.mjs +4 -0
  67. package/package.json +49 -92
  68. package/dist/curve/cubic2d.d.mts +0 -109
  69. package/dist/curve/cubic2d.d.ts +0 -109
  70. package/dist/curve/cubic2d.mjs +0 -80
  71. package/dist/curve/cubic2d.mjs.map +0 -1
  72. package/dist/curve/linear2d.d.mts +0 -94
  73. package/dist/curve/linear2d.d.ts +0 -94
  74. package/dist/curve/linear2d.mjs +0 -46
  75. package/dist/curve/linear2d.mjs.map +0 -1
  76. package/dist/curve/quadratic2d.d.mts +0 -117
  77. package/dist/curve/quadratic2d.d.ts +0 -117
  78. package/dist/curve/quadratic2d.mjs +0 -82
  79. package/dist/curve/quadratic2d.mjs.map +0 -1
  80. package/dist/interval.d.mts +0 -251
  81. package/dist/interval.d.ts +0 -251
  82. package/dist/interval.mjs +0 -86
  83. package/dist/interval.mjs.map +0 -1
  84. package/dist/matrix/matrix2x2.d.mts +0 -320
  85. package/dist/matrix/matrix2x2.d.ts +0 -320
  86. package/dist/matrix/matrix2x2.mjs +0 -25
  87. package/dist/matrix/matrix2x2.mjs.map +0 -1
  88. package/dist/matrix/matrix3x3.d.mts +0 -370
  89. package/dist/matrix/matrix3x3.d.ts +0 -370
  90. package/dist/matrix/matrix3x3.mjs +0 -28
  91. package/dist/matrix/matrix3x3.mjs.map +0 -1
  92. package/dist/matrix/matrix4x4.d.mts +0 -381
  93. package/dist/matrix/matrix4x4.d.ts +0 -381
  94. package/dist/matrix/matrix4x4.mjs +0 -178
  95. package/dist/matrix/matrix4x4.mjs.map +0 -1
  96. package/dist/path/cubic2d.d.mts +0 -95
  97. package/dist/path/cubic2d.d.ts +0 -95
  98. package/dist/path/cubic2d.mjs +0 -60
  99. package/dist/path/cubic2d.mjs.map +0 -1
  100. package/dist/path/linear2d.d.mts +0 -95
  101. package/dist/path/linear2d.d.ts +0 -95
  102. package/dist/path/linear2d.mjs +0 -53
  103. package/dist/path/linear2d.mjs.map +0 -1
  104. package/dist/path/quadratic2d.d.mts +0 -95
  105. package/dist/path/quadratic2d.d.ts +0 -95
  106. package/dist/path/quadratic2d.mjs +0 -57
  107. package/dist/path/quadratic2d.mjs.map +0 -1
  108. package/dist/pipe.d.ts +0 -58
  109. package/dist/pipe.mjs +0 -92
  110. package/dist/pipe.mjs.map +0 -1
  111. package/dist/polynomial/cubic.d.mts +0 -7
  112. package/dist/polynomial/cubic.d.ts +0 -7
  113. package/dist/polynomial/cubic.mjs +0 -133
  114. package/dist/polynomial/cubic.mjs.map +0 -1
  115. package/dist/polynomial/linear.d.mts +0 -7
  116. package/dist/polynomial/linear.d.ts +0 -7
  117. package/dist/polynomial/linear.mjs +0 -24
  118. package/dist/polynomial/linear.mjs.map +0 -1
  119. package/dist/polynomial/quadratic.d.mts +0 -7
  120. package/dist/polynomial/quadratic.d.ts +0 -7
  121. package/dist/polynomial/quadratic.mjs +0 -27
  122. package/dist/polynomial/quadratic.mjs.map +0 -1
  123. package/dist/shared/curvy.Bf5TIk31.d.mts +0 -22
  124. package/dist/shared/curvy.Bf5TIk31.d.ts +0 -22
  125. package/dist/shared/curvy.BkkW8Tx9.mjs +0 -102
  126. package/dist/shared/curvy.BkkW8Tx9.mjs.map +0 -1
  127. package/dist/shared/curvy.BxdGW9he.mjs +0 -116
  128. package/dist/shared/curvy.BxdGW9he.mjs.map +0 -1
  129. package/dist/shared/curvy.C_sCeg9J.mjs +0 -66
  130. package/dist/shared/curvy.C_sCeg9J.mjs.map +0 -1
  131. package/dist/shared/curvy.Cg8lZVUz.d.ts +0 -688
  132. package/dist/shared/curvy.DCt1gGII.mjs +0 -147
  133. package/dist/shared/curvy.DCt1gGII.mjs.map +0 -1
  134. package/dist/shared/curvy.DJ4xO0al.mjs +0 -63
  135. package/dist/shared/curvy.DJ4xO0al.mjs.map +0 -1
  136. package/dist/shared/curvy.DmVFTi0N.mjs +0 -35
  137. package/dist/shared/curvy.DmVFTi0N.mjs.map +0 -1
  138. package/dist/shared/curvy.FDaj5rlj.d.mts +0 -688
  139. package/dist/shared/curvy.lktriTpx.mjs +0 -101
  140. package/dist/shared/curvy.lktriTpx.mjs.map +0 -1
  141. package/dist/shared/curvy.mLFprrGm.mjs +0 -85
  142. package/dist/shared/curvy.mLFprrGm.mjs.map +0 -1
  143. package/dist/shared/curvy.r6f1j287.mjs +0 -76
  144. package/dist/shared/curvy.r6f1j287.mjs.map +0 -1
  145. package/dist/splines/basis2d.d.mts +0 -130
  146. package/dist/splines/basis2d.d.ts +0 -130
  147. package/dist/splines/basis2d.mjs +0 -90
  148. package/dist/splines/basis2d.mjs.map +0 -1
  149. package/dist/splines/bezier2d.d.mts +0 -182
  150. package/dist/splines/bezier2d.d.ts +0 -182
  151. package/dist/splines/bezier2d.mjs +0 -23
  152. package/dist/splines/bezier2d.mjs.map +0 -1
  153. package/dist/splines/cardinal2d.d.mts +0 -178
  154. package/dist/splines/cardinal2d.d.ts +0 -178
  155. package/dist/splines/cardinal2d.mjs +0 -114
  156. package/dist/splines/cardinal2d.mjs.map +0 -1
  157. package/dist/splines/hermite2d.d.mts +0 -124
  158. package/dist/splines/hermite2d.d.ts +0 -124
  159. package/dist/splines/hermite2d.mjs +0 -63
  160. package/dist/splines/hermite2d.mjs.map +0 -1
  161. package/dist/utils.d.ts +0 -205
  162. package/dist/vector/vector2.d.mts +0 -324
  163. package/dist/vector/vector2.d.ts +0 -324
  164. package/dist/vector/vector2.mjs +0 -30
  165. package/dist/vector/vector2.mjs.map +0 -1
  166. package/dist/vector/vector3.d.mts +0 -417
  167. package/dist/vector/vector3.d.ts +0 -417
  168. package/dist/vector/vector3.mjs +0 -38
  169. package/dist/vector/vector3.mjs.map +0 -1
  170. package/dist/vector/vector4.d.mts +0 -205
  171. package/dist/vector/vector4.d.ts +0 -205
  172. package/dist/vector/vector4.mjs +0 -20
  173. package/dist/vector/vector4.mjs.map +0 -1
@@ -0,0 +1,421 @@
1
+ import { t as __exportAll } from "./chunk-25Hzd3z8.mjs";
2
+ import { Pipeable, dual } from "../utils.mjs";
3
+ import { epsEquals } from "../number.mjs";
4
+ //#region src/interval/interval.internal.ts
5
+ const TypeId = Symbol.for("curvy/interval");
6
+ var IntervalImpl = class extends Pipeable {
7
+ [TypeId] = TypeId;
8
+ start;
9
+ end;
10
+ constructor(start, end) {
11
+ super();
12
+ if (end < start) throw new Error("Interval end must be greater than or equal to start");
13
+ this.start = start;
14
+ this.end = end;
15
+ }
16
+ get [Symbol.toStringTag]() {
17
+ const open = this.kind === "open-start" || this.kind === "open" ? "(" : "[";
18
+ const close = this.kind === "open-end" || this.kind === "open" ? ")" : "]";
19
+ return `Interval ${open}${this.start}, ${this.end}${close}`;
20
+ }
21
+ get [Symbol.for("nodejs.util.inspect.custom")]() {
22
+ return this[Symbol.toStringTag];
23
+ }
24
+ };
25
+ var ClosedImpl = class extends IntervalImpl {
26
+ kind = "closed";
27
+ };
28
+ var OpenStartImpl = class extends IntervalImpl {
29
+ kind = "open-start";
30
+ };
31
+ var OpenEndImpl = class extends IntervalImpl {
32
+ kind = "open-end";
33
+ };
34
+ var OpenImpl = class extends IntervalImpl {
35
+ kind = "open";
36
+ };
37
+ const isInterval$1 = (v) => typeof v === "object" && v !== null && TypeId in v;
38
+ const equals$1 = dual(2, (a, b) => a.kind === b.kind && epsEquals(a.start, b.start) && epsEquals(a.end, b.end));
39
+ const aligned$1 = dual(2, (a, b) => epsEquals(a.start, b.start) && epsEquals(a.end, b.end));
40
+ const make$1 = (start, end) => new ClosedImpl(start, end ?? start);
41
+ const makeOpenStart$1 = (start, end) => new OpenStartImpl(start, end ?? start);
42
+ const makeOpenEnd$1 = (start, end) => new OpenEndImpl(start, end ?? start);
43
+ const makeOpen$1 = (start, end) => new OpenImpl(start, end ?? start);
44
+ const fromSize$1 = (a, b) => {
45
+ if (b === void 0) return new ClosedImpl(0, a);
46
+ return new ClosedImpl(a, a + b);
47
+ };
48
+ const fromMinMax$1 = (...values) => new ClosedImpl(Math.min(...values), Math.max(...values));
49
+ const size$1 = (i) => Math.abs(i.end - i.start);
50
+ const contains$1 = dual(2, (interval, value) => {
51
+ switch (interval.kind) {
52
+ case "closed": return value >= interval.start && value <= interval.end;
53
+ case "open-start": return value > interval.start && value <= interval.end;
54
+ case "open-end": return value >= interval.start && value < interval.end;
55
+ case "open": return value > interval.start && value < interval.end;
56
+ }
57
+ });
58
+ const includesStart = (i) => i.kind === "closed" || i.kind === "open-end";
59
+ const includesEnd = (i) => i.kind === "closed" || i.kind === "open-start";
60
+ const containsInterval$1 = dual(2, (outer, inner) => {
61
+ const outerStart = includesStart(outer);
62
+ const innerStart = includesStart(inner);
63
+ const outerEnd = includesEnd(outer);
64
+ const innerEnd = includesEnd(inner);
65
+ const startOk = inner.start > outer.start || inner.start === outer.start && (outerStart || !innerStart);
66
+ const endOk = inner.end < outer.end || inner.end === outer.end && (outerEnd || !innerEnd);
67
+ return startOk && endOk;
68
+ });
69
+ const union$1 = dual(2, (a, b) => {
70
+ let startVal;
71
+ let startInc;
72
+ if (a.start < b.start) {
73
+ startVal = a.start;
74
+ startInc = includesStart(a);
75
+ } else if (a.start > b.start) {
76
+ startVal = b.start;
77
+ startInc = includesStart(b);
78
+ } else {
79
+ startVal = a.start;
80
+ startInc = includesStart(a) || includesStart(b);
81
+ }
82
+ let endVal;
83
+ let endInc;
84
+ if (a.end > b.end) {
85
+ endVal = a.end;
86
+ endInc = includesEnd(a);
87
+ } else if (a.end < b.end) {
88
+ endVal = b.end;
89
+ endInc = includesEnd(b);
90
+ } else {
91
+ endVal = a.end;
92
+ endInc = includesEnd(a) || includesEnd(b);
93
+ }
94
+ if (startInc && endInc) return make$1(startVal, endVal);
95
+ if (!startInc && endInc) return makeOpenStart$1(startVal, endVal);
96
+ if (startInc && !endInc) return makeOpenEnd$1(startVal, endVal);
97
+ return makeOpen$1(startVal, endVal);
98
+ });
99
+ const filter$1 = dual(2, (interval, value) => value.filter((v) => contains$1(interval, v)));
100
+ const clamp$1 = dual(2, (interval, value) => {
101
+ if (Array.isArray(value)) return value.map((v) => clamp$1(interval, v));
102
+ const v = value;
103
+ if (v < interval.start) return interval.start;
104
+ if (v > interval.end) return interval.end;
105
+ return v;
106
+ });
107
+ const toStartOpen$1 = ((i) => {
108
+ switch (i.kind) {
109
+ case "closed": return new OpenStartImpl(i.start, i.end);
110
+ case "open-end": return new OpenImpl(i.start, i.end);
111
+ case "open-start":
112
+ case "open": return i;
113
+ }
114
+ });
115
+ const toStartClosed$1 = ((i) => {
116
+ switch (i.kind) {
117
+ case "open-start": return new ClosedImpl(i.start, i.end);
118
+ case "open": return new OpenEndImpl(i.start, i.end);
119
+ case "closed":
120
+ case "open-end": return i;
121
+ }
122
+ });
123
+ const toEndOpen$1 = ((i) => {
124
+ switch (i.kind) {
125
+ case "closed": return new OpenEndImpl(i.start, i.end);
126
+ case "open-start": return new OpenImpl(i.start, i.end);
127
+ case "open-end":
128
+ case "open": return i;
129
+ }
130
+ });
131
+ const toEndClosed$1 = ((i) => {
132
+ switch (i.kind) {
133
+ case "open-end": return new ClosedImpl(i.start, i.end);
134
+ case "open": return new OpenStartImpl(i.start, i.end);
135
+ case "closed":
136
+ case "open-start": return i;
137
+ }
138
+ });
139
+ const toClosed$1 = (i) => {
140
+ if (i.kind === "closed") return i;
141
+ return new ClosedImpl(i.start, i.end);
142
+ };
143
+ const toOpen$1 = (i) => {
144
+ if (i.kind === "open") return i;
145
+ return new OpenImpl(i.start, i.end);
146
+ };
147
+ const isClosed$1 = (i) => i.kind === "closed";
148
+ const isOpen$1 = (i) => i.kind === "open";
149
+ const isOpenStart$1 = (i) => i.kind === "open-start";
150
+ const isOpenEnd$1 = (i) => i.kind === "open-end";
151
+ const isOpenAtStart$1 = (i) => i.kind === "open-start" || i.kind === "open";
152
+ const isOpenAtEnd$1 = (i) => i.kind === "open-end" || i.kind === "open";
153
+ const isClosedAtStart$1 = (i) => i.kind === "closed" || i.kind === "open-end";
154
+ const isClosedAtEnd$1 = (i) => i.kind === "closed" || i.kind === "open-start";
155
+ const unit$1 = make$1(0, 1);
156
+ const unitOpen$1 = new OpenImpl(0, 1);
157
+ const biunit$1 = make$1(-1, 1);
158
+ const lerp$1 = (interval, t) => (1 - t) * interval.start + t * interval.end;
159
+ const toLerpFn$1 = (interval) => (t) => lerp$1(interval, t);
160
+ const normalize$1 = (interval, x) => (x - interval.start) / size$1(interval);
161
+ const toNormalizeFn$1 = (interval) => (x) => normalize$1(interval, x);
162
+ const remap$1 = (source, target, x) => target.start + (x - source.start) * size$1(target) / size$1(source);
163
+ const toRemapFn$1 = (source, target) => (x) => remap$1(source, target, x);
164
+ const scaleShift$1 = (source, target) => {
165
+ const scale = size$1(target) / size$1(source);
166
+ return {
167
+ scale,
168
+ shift: target.start - source.start * scale
169
+ };
170
+ };
171
+ //#endregion
172
+ //#region src/interval/interval.ts
173
+ var interval_exports = /* @__PURE__ */ __exportAll({
174
+ aligned: () => aligned,
175
+ biunit: () => biunit,
176
+ clamp: () => clamp,
177
+ contains: () => contains,
178
+ containsInterval: () => containsInterval,
179
+ equals: () => equals,
180
+ filter: () => filter,
181
+ fromMinMax: () => fromMinMax,
182
+ fromSize: () => fromSize,
183
+ isClosed: () => isClosed,
184
+ isClosedAtEnd: () => isClosedAtEnd,
185
+ isClosedAtStart: () => isClosedAtStart,
186
+ isInterval: () => isInterval,
187
+ isOpen: () => isOpen,
188
+ isOpenAtEnd: () => isOpenAtEnd,
189
+ isOpenAtStart: () => isOpenAtStart,
190
+ isOpenEnd: () => isOpenEnd,
191
+ isOpenStart: () => isOpenStart,
192
+ lerp: () => lerp,
193
+ make: () => make,
194
+ makeOpen: () => makeOpen,
195
+ makeOpenEnd: () => makeOpenEnd,
196
+ makeOpenStart: () => makeOpenStart,
197
+ normalize: () => normalize,
198
+ remap: () => remap,
199
+ scaleShift: () => scaleShift,
200
+ size: () => size,
201
+ toClosed: () => toClosed,
202
+ toEndClosed: () => toEndClosed,
203
+ toEndOpen: () => toEndOpen,
204
+ toLerpFn: () => toLerpFn,
205
+ toNormalizeFn: () => toNormalizeFn,
206
+ toOpen: () => toOpen,
207
+ toRemapFn: () => toRemapFn,
208
+ toStartClosed: () => toStartClosed,
209
+ toStartOpen: () => toStartOpen,
210
+ union: () => union,
211
+ unit: () => unit,
212
+ unitOpen: () => unitOpen
213
+ });
214
+ /**
215
+ * Checks if a value is an `Interval`.
216
+ *
217
+ * @param v - The value to check.
218
+ * @returns `true` if the value is an `Interval`, `false` otherwise.
219
+ * @since 1.0.0
220
+ */
221
+ const isInterval = isInterval$1;
222
+ const equals = equals$1;
223
+ const aligned = aligned$1;
224
+ const make = make$1;
225
+ const makeOpenStart = makeOpenStart$1;
226
+ const makeOpenEnd = makeOpenEnd$1;
227
+ const makeOpen = makeOpen$1;
228
+ const fromSize = fromSize$1;
229
+ /**
230
+ * Creates a new closed `Interval` from a minimum and maximum value, in any order.
231
+ *
232
+ * @param values - The values to take the min and max of.
233
+ * @returns A new `Closed` interval `[min(values), max(values)]`.
234
+ * @since 1.0.0
235
+ */
236
+ const fromMinMax = fromMinMax$1;
237
+ /**
238
+ * Calculates the size of an interval.
239
+ *
240
+ * Kind-agnostic — `size` of `[0, 1]` and `(0, 1)` are both `1`.
241
+ *
242
+ * @param i - The bounds to calculate the size of.
243
+ * @returns The size of the bounds.
244
+ * @since 1.0.0
245
+ */
246
+ const size = size$1;
247
+ const contains = contains$1;
248
+ const containsInterval = containsInterval$1;
249
+ const union = union$1;
250
+ const filter = filter$1;
251
+ const clamp = clamp$1;
252
+ /**
253
+ * Returns an interval with the start endpoint open. Preserves the end endpoint's inclusivity.
254
+ *
255
+ * @since 2.0.0
256
+ */
257
+ const toStartOpen = toStartOpen$1;
258
+ /**
259
+ * Returns an interval with the start endpoint closed. Preserves the end endpoint's inclusivity.
260
+ *
261
+ * @since 2.0.0
262
+ */
263
+ const toStartClosed = toStartClosed$1;
264
+ /**
265
+ * Returns an interval with the end endpoint open. Preserves the start endpoint's inclusivity.
266
+ *
267
+ * @since 2.0.0
268
+ */
269
+ const toEndOpen = toEndOpen$1;
270
+ /**
271
+ * Returns an interval with the end endpoint closed. Preserves the start endpoint's inclusivity.
272
+ *
273
+ * @since 2.0.0
274
+ */
275
+ const toEndClosed = toEndClosed$1;
276
+ /**
277
+ * Returns a closed interval over the same numeric range.
278
+ *
279
+ * @since 2.0.0
280
+ */
281
+ const toClosed = toClosed$1;
282
+ /**
283
+ * Returns a fully open interval over the same numeric range.
284
+ *
285
+ * @since 2.0.0
286
+ */
287
+ const toOpen = toOpen$1;
288
+ /**
289
+ * Type-narrowing predicate: refines `Interval` to `Closed`.
290
+ *
291
+ * @since 2.0.0
292
+ */
293
+ const isClosed = isClosed$1;
294
+ /**
295
+ * Type-narrowing predicate: refines `Interval` to `Open`.
296
+ *
297
+ * @since 2.0.0
298
+ */
299
+ const isOpen = isOpen$1;
300
+ /**
301
+ * Type-narrowing predicate: refines `Interval` to `OpenStart`.
302
+ *
303
+ * @since 2.0.0
304
+ */
305
+ const isOpenStart = isOpenStart$1;
306
+ /**
307
+ * Type-narrowing predicate: refines `Interval` to `OpenEnd`.
308
+ *
309
+ * @since 2.0.0
310
+ */
311
+ const isOpenEnd = isOpenEnd$1;
312
+ /**
313
+ * Type-narrowing predicate: refines `Interval` to those with an open start endpoint.
314
+ *
315
+ * @since 2.0.0
316
+ */
317
+ const isOpenAtStart = isOpenAtStart$1;
318
+ /**
319
+ * Type-narrowing predicate: refines `Interval` to those with an open end endpoint.
320
+ *
321
+ * @since 2.0.0
322
+ */
323
+ const isOpenAtEnd = isOpenAtEnd$1;
324
+ /**
325
+ * Type-narrowing predicate: refines `Interval` to those with a closed start endpoint.
326
+ *
327
+ * @since 2.0.0
328
+ */
329
+ const isClosedAtStart = isClosedAtStart$1;
330
+ /**
331
+ * Type-narrowing predicate: refines `Interval` to those with a closed end endpoint.
332
+ *
333
+ * @since 2.0.0
334
+ */
335
+ const isClosedAtEnd = isClosedAtEnd$1;
336
+ /**
337
+ * The unit interval, `[0, 1]`.
338
+ *
339
+ * @since 1.0.0
340
+ */
341
+ const unit = unit$1;
342
+ /**
343
+ * The open unit interval, `(0, 1)`. The symmetric open analog of {@link unit};
344
+ * convenient for "strict interior" use cases such as filtering roots that
345
+ * must lie strictly inside the unit parameter range.
346
+ *
347
+ * @since 2.1.0
348
+ */
349
+ const unitOpen = unitOpen$1;
350
+ /**
351
+ * The biunit interval, `[-1, 1]`.
352
+ *
353
+ * @since 1.0.0
354
+ */
355
+ const biunit = biunit$1;
356
+ /**
357
+ * Linearly interpolates a value within bounds.
358
+ *
359
+ * @param interval - The bounds to interpolate within.
360
+ * @param t - The interpolation factor, typically between 0 and 1.
361
+ * @returns The interpolated value.
362
+ * @since 1.0.0
363
+ */
364
+ const lerp = lerp$1;
365
+ /**
366
+ * Creates a linear interpolation function for given bounds.
367
+ *
368
+ * @param interval - The bounds to create the interpolation function for.
369
+ * @returns A function that takes a factor `t` and returns the interpolated value.
370
+ * @since 1.0.0
371
+ */
372
+ const toLerpFn = toLerpFn$1;
373
+ /**
374
+ * Normalizes a value within bounds.
375
+ *
376
+ * @param interval - The bounds to normalize within.
377
+ * @param x - The value to normalize.
378
+ * @returns The normalized value.
379
+ * @since 1.0.0
380
+ */
381
+ const normalize = normalize$1;
382
+ /**
383
+ * Creates a normalization function for given bounds.
384
+ *
385
+ * @param interval - The bounds to create the normalization function for.
386
+ * @returns A function that takes a value `x` and returns the normalized value.
387
+ * @since 1.0.0
388
+ */
389
+ const toNormalizeFn = toNormalizeFn$1;
390
+ /**
391
+ * Remaps a value from one bounds to another.
392
+ *
393
+ * @param source - The source bounds.
394
+ * @param target - The target bounds.
395
+ * @param x - The value to remap.
396
+ * @returns The remapped value.
397
+ * @since 1.0.0
398
+ */
399
+ const remap = remap$1;
400
+ /**
401
+ * Creates a remapping function for given bounds.
402
+ *
403
+ * @param source - The source bounds.
404
+ * @param target - The target bounds.
405
+ * @returns A function that takes a value `x` and returns the remapped value.
406
+ * @since 1.0.0
407
+ */
408
+ const toRemapFn = toRemapFn$1;
409
+ /**
410
+ * Calculates the scale and shift needed to map a source bounds to a target bounds.
411
+ *
412
+ * @param source - The source bounds.
413
+ * @param target - The target bounds.
414
+ * @returns An object containing the scale and shift values.
415
+ * @since 1.0.0
416
+ */
417
+ const scaleShift = scaleShift$1;
418
+ //#endregion
419
+ export { filter as a, make as c, toOpen as d, union as f, equals as i, scaleShift as l, unitOpen as m, contains as n, fromMinMax as o, unit as p, containsInterval as r, interval_exports as s, biunit as t, size as u };
420
+
421
+ //# sourceMappingURL=interval-05CR6eBf.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interval-05CR6eBf.mjs","names":["isInterval","equals","aligned","make","makeOpenStart","makeOpenEnd","makeOpen","fromSize","fromMinMax","size","contains","containsInterval","union","filter","clamp","toStartOpen","toStartClosed","toEndOpen","toEndClosed","toClosed","toOpen","isClosed","isOpen","isOpenStart","isOpenEnd","isOpenAtStart","isOpenAtEnd","isClosedAtStart","isClosedAtEnd","unit","unitOpen","biunit","lerp","toLerpFn","normalize","toNormalizeFn","remap","toRemapFn","scaleShift","internal.isInterval","internal.equals","internal.aligned","internal.make","internal.makeOpenStart","internal.makeOpenEnd","internal.makeOpen","internal.fromSize","internal.fromMinMax","internal.size","internal.contains","internal.containsInterval","internal.union","internal.filter","internal.clamp","internal.toStartOpen","internal.toStartClosed","internal.toEndOpen","internal.toEndClosed","internal.toClosed","internal.toOpen","internal.isClosed","internal.isOpen","internal.isOpenStart","internal.isOpenEnd","internal.isOpenAtStart","internal.isOpenAtEnd","internal.isClosedAtStart","internal.isClosedAtEnd","internal.unit","internal.unitOpen","internal.biunit","internal.lerp","internal.toLerpFn","internal.normalize","internal.toNormalizeFn","internal.remap","internal.toRemapFn","internal.scaleShift"],"sources":["../../src/interval/interval.internal.ts","../../src/interval/interval.ts"],"sourcesContent":["import type { Bounds, Closed, Interval, Open, OpenEnd, OpenStart } from './interval'\nimport { dual, Pipeable } from '../utils'\nimport { epsEquals } from '../number'\n\nconst TypeId: unique symbol = Symbol.for('curvy/interval')\ntype TypeId = typeof TypeId\n\nabstract class IntervalImpl extends Pipeable {\n readonly [TypeId]: TypeId = TypeId\n\n abstract readonly kind: 'closed' | 'open-start' | 'open-end' | 'open'\n\n readonly start: number\n readonly end: number\n\n constructor(start: number, end: number) {\n super()\n\n if (end < start) {\n throw new Error('Interval end must be greater than or equal to start')\n }\n\n this.start = start\n this.end = end\n }\n\n get [Symbol.toStringTag]() {\n const open = this.kind === 'open-start' || this.kind === 'open' ? '(' : '['\n const close = this.kind === 'open-end' || this.kind === 'open' ? ')' : ']'\n return `Interval ${open}${this.start}, ${this.end}${close}`\n }\n\n get [Symbol.for('nodejs.util.inspect.custom')]() {\n return this[Symbol.toStringTag]\n }\n}\n\nclass ClosedImpl extends IntervalImpl implements Closed {\n readonly kind = 'closed' as const\n}\n\nclass OpenStartImpl extends IntervalImpl implements OpenStart {\n readonly kind = 'open-start' as const\n}\n\nclass OpenEndImpl extends IntervalImpl implements OpenEnd {\n readonly kind = 'open-end' as const\n}\n\nclass OpenImpl extends IntervalImpl implements Open {\n readonly kind = 'open' as const\n}\n\nexport const isInterval = (v: unknown): v is Interval =>\n typeof v === 'object' && v !== null && TypeId in v\n\nexport const equals = dual<\n (b: Interval) => (a: Interval) => boolean,\n (a: Interval, b: Interval) => boolean\n>(\n 2,\n (a: Interval, b: Interval) =>\n a.kind === b.kind && epsEquals(a.start, b.start) && epsEquals(a.end, b.end),\n)\n\nexport const aligned = dual<\n (b: Bounds) => (a: Bounds) => boolean,\n (a: Bounds, b: Bounds) => boolean\n>(2, (a: Bounds, b: Bounds) => epsEquals(a.start, b.start) && epsEquals(a.end, b.end))\n\nexport const make = (start: number, end?: number): Closed => new ClosedImpl(start, end ?? start)\n\nexport const makeOpenStart = (start: number, end?: number): OpenStart =>\n new OpenStartImpl(start, end ?? start)\n\nexport const makeOpenEnd = (start: number, end?: number): OpenEnd =>\n new OpenEndImpl(start, end ?? start)\n\nexport const makeOpen = (start: number, end?: number): Open => new OpenImpl(start, end ?? start)\n\nexport const fromSize = (a: number, b?: number): Closed => {\n if (b === undefined) {\n return new ClosedImpl(0, a)\n }\n return new ClosedImpl(a, a + b)\n}\n\nexport const fromMinMax = (...values: ReadonlyArray<number>): Closed =>\n new ClosedImpl(Math.min(...values), Math.max(...values))\n\nexport const size = (i: Bounds): number => Math.abs(i.end - i.start)\n\nexport const contains = dual<\n (value: number) => (interval: Interval) => boolean,\n (interval: Interval, value: number) => boolean\n>(2, (interval: Interval, value: number): boolean => {\n switch (interval.kind) {\n case 'closed':\n return value >= interval.start && value <= interval.end\n case 'open-start':\n return value > interval.start && value <= interval.end\n case 'open-end':\n return value >= interval.start && value < interval.end\n case 'open':\n return value > interval.start && value < interval.end\n }\n})\n\nconst includesStart = (i: Interval): boolean => i.kind === 'closed' || i.kind === 'open-end'\nconst includesEnd = (i: Interval): boolean => i.kind === 'closed' || i.kind === 'open-start'\n\n// Whether `outer` is a superset of `inner`. For each endpoint pair (start/start\n// and end/end), the inner endpoint must be inside outer; when the endpoints\n// are numerically equal, the outer must include that boundary or the inner\n// must exclude it. Both shapes (closed-on-closed, open-on-open with matched\n// endpoints, etc.) are handled by this kind-aware comparison.\nexport const containsInterval = dual<\n (inner: Interval) => (outer: Interval) => boolean,\n (outer: Interval, inner: Interval) => boolean\n>(2, (outer: Interval, inner: Interval): boolean => {\n const outerStart = includesStart(outer)\n const innerStart = includesStart(inner)\n const outerEnd = includesEnd(outer)\n const innerEnd = includesEnd(inner)\n\n const startOk =\n inner.start > outer.start || (inner.start === outer.start && (outerStart || !innerStart))\n const endOk = inner.end < outer.end || (inner.end === outer.end && (outerEnd || !innerEnd))\n\n return startOk && endOk\n})\n\n// Smallest interval enclosing both inputs. Each endpoint of the result is the\n// extremum of (a.start, b.start) / (a.end, b.end), and its inclusivity follows\n// whichever input contributed it. When endpoints tie, the result is closed at\n// that point if EITHER input includes it.\nexport const union = dual<\n (b: Interval) => (a: Interval) => Interval,\n (a: Interval, b: Interval) => Interval\n>(2, (a: Interval, b: Interval): Interval => {\n let startVal: number\n let startInc: boolean\n if (a.start < b.start) {\n startVal = a.start\n startInc = includesStart(a)\n } else if (a.start > b.start) {\n startVal = b.start\n startInc = includesStart(b)\n } else {\n startVal = a.start\n startInc = includesStart(a) || includesStart(b)\n }\n\n let endVal: number\n let endInc: boolean\n if (a.end > b.end) {\n endVal = a.end\n endInc = includesEnd(a)\n } else if (a.end < b.end) {\n endVal = b.end\n endInc = includesEnd(b)\n } else {\n endVal = a.end\n endInc = includesEnd(a) || includesEnd(b)\n }\n\n if (startInc && endInc) {\n return make(startVal, endVal)\n }\n if (!startInc && endInc) {\n return makeOpenStart(startVal, endVal)\n }\n if (startInc && !endInc) {\n return makeOpenEnd(startVal, endVal)\n }\n return makeOpen(startVal, endVal)\n})\n\nexport const filter = dual<\n <V extends ReadonlyArray<number>>(value: V) => (interval: Interval) => V,\n <V extends ReadonlyArray<number>>(interval: Interval, value: V) => V\n>(\n 2,\n <V extends ReadonlyArray<number>>(interval: Interval, value: V): V =>\n value.filter((v) => contains(interval, v)) as unknown as V,\n)\n\nexport const clamp = dual<\n <V extends number | ReadonlyArray<number>>(value: V) => (interval: Bounds) => V,\n <V extends number | ReadonlyArray<number>>(interval: Bounds, value: V) => V\n>(2, <V extends number | ReadonlyArray<number>>(interval: Bounds, value: V): V => {\n if (Array.isArray(value)) {\n return value.map((v) => clamp(interval, v)) as unknown as V\n }\n const v = value as number\n if (v < interval.start) {\n return interval.start as V\n }\n if (v > interval.end) {\n return interval.end as V\n }\n return v as V\n})\n\nexport const toStartOpen = ((i: Interval): OpenStart | Open => {\n switch (i.kind) {\n case 'closed':\n return new OpenStartImpl(i.start, i.end)\n case 'open-end':\n return new OpenImpl(i.start, i.end)\n case 'open-start':\n case 'open':\n return i\n }\n}) as {\n (i: Closed | OpenStart): OpenStart\n (i: OpenEnd | Open): Open\n}\n\nexport const toStartClosed = ((i: Interval): Closed | OpenEnd => {\n switch (i.kind) {\n case 'open-start':\n return new ClosedImpl(i.start, i.end)\n case 'open':\n return new OpenEndImpl(i.start, i.end)\n case 'closed':\n case 'open-end':\n return i\n }\n}) as {\n (i: Closed | OpenEnd): Closed\n (i: OpenStart | Open): OpenEnd\n}\n\nexport const toEndOpen = ((i: Interval): OpenEnd | Open => {\n switch (i.kind) {\n case 'closed':\n return new OpenEndImpl(i.start, i.end)\n case 'open-start':\n return new OpenImpl(i.start, i.end)\n case 'open-end':\n case 'open':\n return i\n }\n}) as {\n (i: Closed | OpenEnd): OpenEnd\n (i: OpenStart | Open): Open\n}\n\nexport const toEndClosed = ((i: Interval): Closed | OpenStart => {\n switch (i.kind) {\n case 'open-end':\n return new ClosedImpl(i.start, i.end)\n case 'open':\n return new OpenStartImpl(i.start, i.end)\n case 'closed':\n case 'open-start':\n return i\n }\n}) as {\n (i: Closed | OpenEnd): Closed\n (i: OpenStart | Open): OpenStart\n}\n\nexport const toClosed = (i: Interval): Closed => {\n if (i.kind === 'closed') {\n return i\n }\n return new ClosedImpl(i.start, i.end)\n}\n\nexport const toOpen = (i: Interval): Open => {\n if (i.kind === 'open') {\n return i\n }\n return new OpenImpl(i.start, i.end)\n}\n\nexport const isClosed = (i: Interval): i is Closed => i.kind === 'closed'\nexport const isOpen = (i: Interval): i is Open => i.kind === 'open'\nexport const isOpenStart = (i: Interval): i is OpenStart => i.kind === 'open-start'\nexport const isOpenEnd = (i: Interval): i is OpenEnd => i.kind === 'open-end'\n\nexport const isOpenAtStart = (i: Interval): i is OpenStart | Open =>\n i.kind === 'open-start' || i.kind === 'open'\nexport const isOpenAtEnd = (i: Interval): i is OpenEnd | Open =>\n i.kind === 'open-end' || i.kind === 'open'\nexport const isClosedAtStart = (i: Interval): i is Closed | OpenEnd =>\n i.kind === 'closed' || i.kind === 'open-end'\nexport const isClosedAtEnd = (i: Interval): i is Closed | OpenStart =>\n i.kind === 'closed' || i.kind === 'open-start'\n\nexport const unit: Closed = make(0, 1)\n\nexport const unitOpen: Open = new OpenImpl(0, 1)\n\nexport const biunit: Closed = make(-1, 1)\n\nexport const lerp = (interval: Bounds, t: number): number =>\n (1 - t) * interval.start + t * interval.end\n\nexport const toLerpFn =\n (interval: Bounds) =>\n (t: number): number =>\n lerp(interval, t)\n\nexport const normalize = (interval: Bounds, x: number): number =>\n (x - interval.start) / size(interval)\n\nexport const toNormalizeFn =\n (interval: Bounds) =>\n (x: number): number =>\n normalize(interval, x)\n\nexport const remap = (source: Bounds, target: Bounds, x: number): number =>\n target.start + ((x - source.start) * size(target)) / size(source)\n\nexport const toRemapFn =\n (source: Bounds, target: Bounds) =>\n (x: number): number =>\n remap(source, target, x)\n\nexport const scaleShift = (source: Bounds, target: Bounds) => {\n const scale = size(target) / size(source)\n\n return {\n scale,\n shift: target.start - source.start * scale,\n }\n}\n","import * as internal from './interval.internal'\nimport type { Pipeable } from '../utils'\n\n/**\n * The structural minimum: any value with numeric `start` and `end` fields.\n *\n * Operations that don't read endpoint inclusivity (e.g. `lerp`, `normalize`,\n * `remap`, `size`) accept `Bounds` so the signature itself documents what\n * the operation depends on.\n *\n * @since 2.0.0\n */\nexport interface Bounds {\n readonly start: number\n readonly end: number\n}\n\n/**\n * A mathematical interval. Discriminated union of four variants by endpoint\n * inclusivity: `Closed`, `OpenStart`, `OpenEnd`, `Open`. Operations that\n * depend on inclusivity (e.g. `contains`, `filter`, `equals`) dispatch on\n * the `kind` field; operations that don't accept the broader `Bounds` type.\n *\n * All fields are readonly and immutable, and all operations create new instances.\n *\n * @since 1.0.0\n */\nexport type Interval = Closed | OpenStart | OpenEnd | Open\n\n/**\n * `[start, end]` — both endpoints included.\n *\n * @since 2.0.0\n */\nexport interface Closed extends Pipeable, Bounds {\n readonly kind: 'closed'\n}\n\n/**\n * `(start, end]` — start excluded, end included.\n *\n * @since 2.0.0\n */\nexport interface OpenStart extends Pipeable, Bounds {\n readonly kind: 'open-start'\n}\n\n/**\n * `[start, end)` — start included, end excluded.\n *\n * @since 2.0.0\n */\nexport interface OpenEnd extends Pipeable, Bounds {\n readonly kind: 'open-end'\n}\n\n/**\n * `(start, end)` — both endpoints excluded.\n *\n * @since 2.0.0\n */\nexport interface Open extends Pipeable, Bounds {\n readonly kind: 'open'\n}\n\n/**\n * Checks if a value is an `Interval`.\n *\n * @param v - The value to check.\n * @returns `true` if the value is an `Interval`, `false` otherwise.\n * @since 1.0.0\n */\nexport const isInterval: (v: unknown) => v is Interval = internal.isInterval\n\nexport const equals: {\n /**\n * Checks if two `Interval` instances are approximately equal within the\n * default absolute tolerance ({@link EPSILON}).\n *\n * Both endpoints AND the kind must match — a `Closed` and an `OpenStart` with\n * the same numeric endpoints are not equal. Use `aligned` for the looser\n * \"same numeric range\" check.\n *\n * @param a - The first interval.\n * @param b - The second interval.\n * @returns `true` when both intervals share a kind and both endpoints are within tolerance.\n * @since 1.1.0\n */\n (a: Interval, b: Interval): boolean\n /**\n * Checks if two `Interval` instances are approximately equal within the\n * default absolute tolerance ({@link EPSILON}).\n *\n * @param b - The second interval.\n * @returns A function that takes the first interval and returns the comparison result.\n * @since 1.1.0\n */\n (b: Interval): (a: Interval) => boolean\n} = internal.equals\n\nexport const aligned: {\n /**\n * Checks if two values share the same numeric range, ignoring endpoint\n * inclusivity. Accepts any `Bounds`-shaped value.\n *\n * @param a - The first bounds.\n * @param b - The second bounds.\n * @returns `true` when both endpoints are within the default tolerance ({@link EPSILON}).\n * @since 2.0.0\n */\n (a: Bounds, b: Bounds): boolean\n /**\n * @param b - The second bounds.\n * @returns A function that takes the first bounds and returns the comparison result.\n * @since 2.0.0\n */\n (b: Bounds): (a: Bounds) => boolean\n} = internal.aligned\n\nexport const make: {\n /**\n * Creates a new closed `Interval` instance.\n *\n * @param point - The point of the interval.\n * @returns A new `Closed` interval `[point, point]`.\n * @since 1.0.0\n */\n (point: number): Closed\n /**\n * Creates a new closed `Interval` instance.\n *\n * @param start - The start of the interval.\n * @param end - The end of the interval.\n * @returns A new `Closed` interval `[start, end]`.\n * @since 1.0.0\n */\n (start: number, end: number): Closed\n} = internal.make\n\nexport const makeOpenStart: {\n /**\n * Creates a new left-open `Interval` instance.\n *\n * @param point - The point of the interval.\n * @returns A new `OpenStart` interval `(point, point]` (degenerate, empty).\n * @since 2.0.0\n */\n (point: number): OpenStart\n /**\n * Creates a new left-open `Interval` instance.\n *\n * @param start - The start of the interval (excluded).\n * @param end - The end of the interval (included).\n * @returns A new `OpenStart` interval `(start, end]`.\n * @since 2.0.0\n */\n (start: number, end: number): OpenStart\n} = internal.makeOpenStart\n\nexport const makeOpenEnd: {\n /**\n * Creates a new right-open `Interval` instance.\n *\n * @param point - The point of the interval.\n * @returns A new `OpenEnd` interval `[point, point)` (degenerate, empty).\n * @since 2.0.0\n */\n (point: number): OpenEnd\n /**\n * Creates a new right-open `Interval` instance.\n *\n * @param start - The start of the interval (included).\n * @param end - The end of the interval (excluded).\n * @returns A new `OpenEnd` interval `[start, end)`.\n * @since 2.0.0\n */\n (start: number, end: number): OpenEnd\n} = internal.makeOpenEnd\n\nexport const makeOpen: {\n /**\n * Creates a new fully open `Interval` instance.\n *\n * @param point - The point of the interval.\n * @returns A new `Open` interval `(point, point)` (degenerate, empty).\n * @since 2.0.0\n */\n (point: number): Open\n /**\n * Creates a new fully open `Interval` instance.\n *\n * @param start - The start of the interval (excluded).\n * @param end - The end of the interval (excluded).\n * @returns A new `Open` interval `(start, end)`.\n * @since 2.0.0\n */\n (start: number, end: number): Open\n} = internal.makeOpen\n\nexport const fromSize: {\n /**\n * Creates a new closed `Interval` instance from a size.\n *\n * @param size - The size of the interval.\n * @returns A new `Closed` interval `[0, size]`.\n * @since 1.0.0\n */\n (size: number): Closed\n /**\n * Creates a new closed `Interval` instance from a size.\n *\n * @param start - The start of the interval.\n * @param size - The size of the interval.\n * @returns A new `Closed` interval `[start, start + size]`.\n * @since 1.0.0\n */\n (start: number, size: number): Closed\n} = internal.fromSize\n\n/**\n * Creates a new closed `Interval` from a minimum and maximum value, in any order.\n *\n * @param values - The values to take the min and max of.\n * @returns A new `Closed` interval `[min(values), max(values)]`.\n * @since 1.0.0\n */\nexport const fromMinMax: (...values: ReadonlyArray<number>) => Closed = internal.fromMinMax\n\n/**\n * Calculates the size of an interval.\n *\n * Kind-agnostic — `size` of `[0, 1]` and `(0, 1)` are both `1`.\n *\n * @param i - The bounds to calculate the size of.\n * @returns The size of the bounds.\n * @since 1.0.0\n */\nexport const size: (i: Bounds) => number = internal.size\n\nexport const contains: {\n /**\n * Checks if a value is contained within an interval. Endpoint inclusivity\n * follows the interval's `kind`.\n *\n * @param interval - The interval to check.\n * @param value - The value to check.\n * @returns `true` if the value is contained within the interval, `false` otherwise.\n * @since 1.0.0\n */\n (interval: Interval, value: number): boolean\n /**\n * Checks if a value is contained within an interval. Endpoint inclusivity\n * follows the interval's `kind`.\n *\n * @param value - The value to check.\n * @returns A function that takes an interval and returns `true` if the value is contained within the interval, `false` otherwise.\n * @since 1.0.0\n */\n (value: number): (interval: Interval) => boolean\n} = internal.contains\n\nexport const containsInterval: {\n /**\n * Checks if `inner` is a subset of `outer` — every point of `inner` is also\n * in `outer`. Respects endpoint inclusivity on both sides: a closed inner\n * endpoint must be inside (or on a closed boundary of) the outer, while an\n * open inner endpoint can sit exactly on an open outer boundary.\n *\n * @param outer - The enclosing interval.\n * @param inner - The candidate inner interval.\n * @returns `true` when `inner` is a subset of `outer`.\n * @since 2.1.0\n */\n (outer: Interval, inner: Interval): boolean\n /**\n * @param inner - The candidate inner interval.\n * @returns A function that takes the outer interval and returns the containment result.\n * @since 2.1.0\n */\n (inner: Interval): (outer: Interval) => boolean\n} = internal.containsInterval\n\nexport const union: {\n /**\n * Returns the smallest interval enclosing both inputs. Each endpoint's\n * inclusivity follows the input that contributed it; when both endpoints\n * tie, the result is closed at that point if either input includes it.\n *\n * @param a - The first interval.\n * @param b - The second interval.\n * @returns A new interval enclosing both inputs.\n * @since 2.1.0\n */\n (a: Interval, b: Interval): Interval\n /**\n * @param b - The second interval.\n * @returns A function that takes the first interval and returns the union.\n * @since 2.1.0\n */\n (b: Interval): (a: Interval) => Interval\n} = internal.union\n\nexport const filter: {\n /**\n * Filters an array of values to those contained within an interval.\n * Endpoint inclusivity follows the interval's `kind`.\n *\n * @param interval - The interval to filter the values to.\n * @param value - The values to filter.\n * @returns The filtered values.\n * @since 1.0.0\n */\n <V extends ReadonlyArray<number>>(interval: Interval, value: V): V\n /**\n * Filters an array of values to those contained within an interval.\n *\n * @param value - The values to filter.\n * @returns A function that takes an interval and returns the filtered values.\n * @since 1.0.0\n */\n <V extends ReadonlyArray<number>>(value: V): (interval: Interval) => V\n} = internal.filter\n\nexport const clamp: {\n /**\n * Clamps a value to be within bounds. Kind-agnostic — clamps to the numeric\n * range regardless of endpoint inclusivity.\n *\n * @param interval - The bounds to clamp the value to.\n * @param value - The value to clamp.\n * @returns The clamped value.\n * @since 1.0.0\n */\n (interval: Bounds, value: number): number\n /**\n * Clamps a value to be within bounds. Kind-agnostic.\n *\n * @param value - The value to clamp.\n * @returns A function that takes bounds and returns the clamped value.\n * @since 1.0.0\n */\n (value: number): (interval: Bounds) => number\n /**\n * Clamps an array of values to be within bounds. Kind-agnostic.\n *\n * @param interval - The bounds to clamp the values to.\n * @param value - The values to clamp.\n * @returns The clamped values.\n * @since 1.0.0\n */\n (interval: Bounds, value: ReadonlyArray<number>): ReadonlyArray<number>\n /**\n * Clamps an array of values to be within bounds. Kind-agnostic.\n *\n * @param value - The values to clamp.\n * @returns A function that takes bounds and returns the clamped values.\n * @since 1.0.0\n */\n (value: ReadonlyArray<number>): (interval: Bounds) => ReadonlyArray<number>\n} = internal.clamp\n\n/**\n * Returns an interval with the start endpoint open. Preserves the end endpoint's inclusivity.\n *\n * @since 2.0.0\n */\nexport const toStartOpen: {\n (i: Closed | OpenStart): OpenStart\n (i: OpenEnd | Open): Open\n} = internal.toStartOpen\n\n/**\n * Returns an interval with the start endpoint closed. Preserves the end endpoint's inclusivity.\n *\n * @since 2.0.0\n */\nexport const toStartClosed: {\n (i: Closed | OpenEnd): Closed\n (i: OpenStart | Open): OpenEnd\n} = internal.toStartClosed\n\n/**\n * Returns an interval with the end endpoint open. Preserves the start endpoint's inclusivity.\n *\n * @since 2.0.0\n */\nexport const toEndOpen: {\n (i: Closed | OpenEnd): OpenEnd\n (i: OpenStart | Open): Open\n} = internal.toEndOpen\n\n/**\n * Returns an interval with the end endpoint closed. Preserves the start endpoint's inclusivity.\n *\n * @since 2.0.0\n */\nexport const toEndClosed: {\n (i: Closed | OpenEnd): Closed\n (i: OpenStart | Open): OpenStart\n} = internal.toEndClosed\n\n/**\n * Returns a closed interval over the same numeric range.\n *\n * @since 2.0.0\n */\nexport const toClosed: (i: Interval) => Closed = internal.toClosed\n\n/**\n * Returns a fully open interval over the same numeric range.\n *\n * @since 2.0.0\n */\nexport const toOpen: (i: Interval) => Open = internal.toOpen\n\n/**\n * Type-narrowing predicate: refines `Interval` to `Closed`.\n *\n * @since 2.0.0\n */\nexport const isClosed: (i: Interval) => i is Closed = internal.isClosed\n\n/**\n * Type-narrowing predicate: refines `Interval` to `Open`.\n *\n * @since 2.0.0\n */\nexport const isOpen: (i: Interval) => i is Open = internal.isOpen\n\n/**\n * Type-narrowing predicate: refines `Interval` to `OpenStart`.\n *\n * @since 2.0.0\n */\nexport const isOpenStart: (i: Interval) => i is OpenStart = internal.isOpenStart\n\n/**\n * Type-narrowing predicate: refines `Interval` to `OpenEnd`.\n *\n * @since 2.0.0\n */\nexport const isOpenEnd: (i: Interval) => i is OpenEnd = internal.isOpenEnd\n\n/**\n * Type-narrowing predicate: refines `Interval` to those with an open start endpoint.\n *\n * @since 2.0.0\n */\nexport const isOpenAtStart: (i: Interval) => i is OpenStart | Open = internal.isOpenAtStart\n\n/**\n * Type-narrowing predicate: refines `Interval` to those with an open end endpoint.\n *\n * @since 2.0.0\n */\nexport const isOpenAtEnd: (i: Interval) => i is OpenEnd | Open = internal.isOpenAtEnd\n\n/**\n * Type-narrowing predicate: refines `Interval` to those with a closed start endpoint.\n *\n * @since 2.0.0\n */\nexport const isClosedAtStart: (i: Interval) => i is Closed | OpenEnd = internal.isClosedAtStart\n\n/**\n * Type-narrowing predicate: refines `Interval` to those with a closed end endpoint.\n *\n * @since 2.0.0\n */\nexport const isClosedAtEnd: (i: Interval) => i is Closed | OpenStart = internal.isClosedAtEnd\n\n/**\n * The unit interval, `[0, 1]`.\n *\n * @since 1.0.0\n */\nexport const unit: Closed = internal.unit\n\n/**\n * The open unit interval, `(0, 1)`. The symmetric open analog of {@link unit};\n * convenient for \"strict interior\" use cases such as filtering roots that\n * must lie strictly inside the unit parameter range.\n *\n * @since 2.1.0\n */\nexport const unitOpen: Open = internal.unitOpen\n\n/**\n * The biunit interval, `[-1, 1]`.\n *\n * @since 1.0.0\n */\nexport const biunit: Closed = internal.biunit\n\n/**\n * Linearly interpolates a value within bounds.\n *\n * @param interval - The bounds to interpolate within.\n * @param t - The interpolation factor, typically between 0 and 1.\n * @returns The interpolated value.\n * @since 1.0.0\n */\nexport const lerp: (interval: Bounds, t: number) => number = internal.lerp\n\n/**\n * Creates a linear interpolation function for given bounds.\n *\n * @param interval - The bounds to create the interpolation function for.\n * @returns A function that takes a factor `t` and returns the interpolated value.\n * @since 1.0.0\n */\nexport const toLerpFn: (interval: Bounds) => (t: number) => number = internal.toLerpFn\n\n/**\n * Normalizes a value within bounds.\n *\n * @param interval - The bounds to normalize within.\n * @param x - The value to normalize.\n * @returns The normalized value.\n * @since 1.0.0\n */\nexport const normalize: (interval: Bounds, x: number) => number = internal.normalize\n\n/**\n * Creates a normalization function for given bounds.\n *\n * @param interval - The bounds to create the normalization function for.\n * @returns A function that takes a value `x` and returns the normalized value.\n * @since 1.0.0\n */\nexport const toNormalizeFn: (interval: Bounds) => (x: number) => number = internal.toNormalizeFn\n\n/**\n * Remaps a value from one bounds to another.\n *\n * @param source - The source bounds.\n * @param target - The target bounds.\n * @param x - The value to remap.\n * @returns The remapped value.\n * @since 1.0.0\n */\nexport const remap: (source: Bounds, target: Bounds, x: number) => number = internal.remap\n\n/**\n * Creates a remapping function for given bounds.\n *\n * @param source - The source bounds.\n * @param target - The target bounds.\n * @returns A function that takes a value `x` and returns the remapped value.\n * @since 1.0.0\n */\nexport const toRemapFn: (source: Bounds, target: Bounds) => (x: number) => number =\n internal.toRemapFn\n\n/**\n * Calculates the scale and shift needed to map a source bounds to a target bounds.\n *\n * @param source - The source bounds.\n * @param target - The target bounds.\n * @returns An object containing the scale and shift values.\n * @since 1.0.0\n */\nexport const scaleShift: (source: Bounds, target: Bounds) => ScaleShift = internal.scaleShift\n\n/**\n * The scale and shift needed to map a source bounds to a target bounds.\n *\n * @since 1.0.0\n */\nexport interface ScaleShift {\n readonly scale: number\n readonly shift: number\n}\n"],"mappings":"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"}