curvy 2.0.0-alpha.13 → 2.0.0-alpha.14

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 (93) hide show
  1. package/dist/characteristic/index.mjs +1 -1
  2. package/dist/curve/cubic2d.d.ts +102 -3
  3. package/dist/curve/curve2d.d.ts +81 -0
  4. package/dist/curve/index.mjs +1 -1
  5. package/dist/curve/linear2d.d.ts +122 -3
  6. package/dist/curve/quadratic2d.d.ts +103 -3
  7. package/dist/curve/rationalCubic2d.d.ts +100 -38
  8. package/dist/interval/index.mjs +2 -2
  9. package/dist/matrix/index.mjs +47 -1
  10. package/dist/matrix/index.mjs.map +1 -1
  11. package/dist/matrix/matrix3x3.d.ts +87 -1
  12. package/dist/matrix/matrix4x4.d.ts +57 -6
  13. package/dist/matrix/traits.d.ts +34 -0
  14. package/dist/monotonicity/index.mjs +1 -1
  15. package/dist/monotonicity/monotonicity.d.ts +25 -0
  16. package/dist/number.d.ts +53 -0
  17. package/dist/number.mjs +56 -1
  18. package/dist/number.mjs.map +1 -1
  19. package/dist/path/cubic2d.d.ts +22 -0
  20. package/dist/path/index.mjs +25 -149
  21. package/dist/path/index.mjs.map +1 -1
  22. package/dist/path/linear2d.d.ts +24 -0
  23. package/dist/path/path2d.d.ts +54 -0
  24. package/dist/path/quadratic2d.d.ts +22 -0
  25. package/dist/path/rationalCubic2d.d.ts +21 -0
  26. package/dist/polynomial/index.mjs +2 -2
  27. package/dist/shared/affine2d-Dvna84gc.mjs +332 -0
  28. package/dist/shared/affine2d-Dvna84gc.mjs.map +1 -0
  29. package/dist/shared/{characteristic-BkEr-rr8.mjs → characteristic--7nC4Q_a.mjs} +4 -5
  30. package/dist/shared/characteristic--7nC4Q_a.mjs.map +1 -0
  31. package/dist/shared/{cubic-BL6dpuHh.mjs → cubic-BiGuAnZ0.mjs} +56 -27
  32. package/dist/shared/cubic-BiGuAnZ0.mjs.map +1 -0
  33. package/dist/shared/{interval-Dm35Xhy4.mjs → interval-Dcqpo73t.mjs} +5 -5
  34. package/dist/shared/interval-Dcqpo73t.mjs.map +1 -0
  35. package/dist/shared/{interval2d-AtneyI45.mjs → interval2d-C2Pk66-2.mjs} +3 -3
  36. package/dist/shared/{interval2d-AtneyI45.mjs.map → interval2d-C2Pk66-2.mjs.map} +1 -1
  37. package/dist/shared/matrix3x3.internal-Cod-r7H3.mjs +233 -0
  38. package/dist/shared/matrix3x3.internal-Cod-r7H3.mjs.map +1 -0
  39. package/dist/shared/{matrix4x4-BWmf4lZM.mjs → matrix4x4-BrqgYZCD.mjs} +72 -223
  40. package/dist/shared/matrix4x4-BrqgYZCD.mjs.map +1 -0
  41. package/dist/shared/monotonicity-DNxBoC7F.mjs +64 -0
  42. package/dist/shared/monotonicity-DNxBoC7F.mjs.map +1 -0
  43. package/dist/shared/{quadratic-DPrUsFCp.mjs → quadratic-BmMqkvxx.mjs} +2 -2
  44. package/dist/shared/{quadratic-DPrUsFCp.mjs.map → quadratic-BmMqkvxx.mjs.map} +1 -1
  45. package/dist/shared/{rationalCubic2d-CeHgpNht.mjs → rationalCubic2d-CZSwwKtS.mjs} +591 -125
  46. package/dist/shared/rationalCubic2d-CZSwwKtS.mjs.map +1 -0
  47. package/dist/shared/{rationalCubic2d-H1J2Fjyy.mjs → rationalCubic2d-bveuGqBZ.mjs} +282 -326
  48. package/dist/shared/rationalCubic2d-bveuGqBZ.mjs.map +1 -0
  49. package/dist/shared/{solution-B2JdOZpe.mjs → solution-BW0BBMXI.mjs} +22 -6
  50. package/dist/shared/solution-BW0BBMXI.mjs.map +1 -0
  51. package/dist/shared/{vector2-CSkaMXvp.mjs → vector2-DuA3EmfL.mjs} +5 -3
  52. package/dist/shared/vector2-DuA3EmfL.mjs.map +1 -0
  53. package/dist/shared/{vector2.internal-DP1nTBdS.mjs → vector2.internal-rPnW0RCx.mjs} +10 -5
  54. package/dist/shared/vector2.internal-rPnW0RCx.mjs.map +1 -0
  55. package/dist/shared/{vector3-CR2LPV03.mjs → vector3-oxtggkDp.mjs} +2 -2
  56. package/dist/shared/{vector3-CR2LPV03.mjs.map → vector3-oxtggkDp.mjs.map} +1 -1
  57. package/dist/shared/vector3.internal-CfWHl9SG.mjs +135 -0
  58. package/dist/shared/vector3.internal-CfWHl9SG.mjs.map +1 -0
  59. package/dist/shared/{vector4-PO_7EYd-.mjs → vector4-DGHuCvTV.mjs} +2 -2
  60. package/dist/shared/{vector4-PO_7EYd-.mjs.map → vector4-DGHuCvTV.mjs.map} +1 -1
  61. package/dist/shared/vector4.internal-DH5DzNYO.mjs +116 -0
  62. package/dist/shared/vector4.internal-DH5DzNYO.mjs.map +1 -0
  63. package/dist/solution/index.mjs +1 -1
  64. package/dist/solution/solution.d.ts +16 -0
  65. package/dist/splines/basis2d.d.ts +64 -0
  66. package/dist/splines/bezier2d.d.ts +72 -0
  67. package/dist/splines/cardinal2d.d.ts +78 -0
  68. package/dist/splines/hermite2d.d.ts +76 -0
  69. package/dist/splines/index.mjs +109 -15
  70. package/dist/splines/index.mjs.map +1 -1
  71. package/dist/splines/linear2d.d.ts +65 -0
  72. package/dist/splines/rationalBezier2d.d.ts +76 -0
  73. package/dist/transform/affine2d.d.ts +339 -0
  74. package/dist/transform/affine2d.internal.d.ts +2 -0
  75. package/dist/transform/index.d.ts +3 -0
  76. package/dist/transform/index.mjs +2 -0
  77. package/dist/transform/traits.d.ts +19 -0
  78. package/dist/vector/index.mjs +3 -3
  79. package/dist/vector/vector2.d.ts +49 -0
  80. package/package.json +5 -1
  81. package/dist/shared/characteristic-BkEr-rr8.mjs.map +0 -1
  82. package/dist/shared/cubic-BL6dpuHh.mjs.map +0 -1
  83. package/dist/shared/interval-Dm35Xhy4.mjs.map +0 -1
  84. package/dist/shared/matrix4x4-BWmf4lZM.mjs.map +0 -1
  85. package/dist/shared/monotonicity-BdebFOtv.mjs +0 -34
  86. package/dist/shared/monotonicity-BdebFOtv.mjs.map +0 -1
  87. package/dist/shared/rationalCubic2d-CeHgpNht.mjs.map +0 -1
  88. package/dist/shared/rationalCubic2d-H1J2Fjyy.mjs.map +0 -1
  89. package/dist/shared/solution-B2JdOZpe.mjs.map +0 -1
  90. package/dist/shared/vector2-CSkaMXvp.mjs.map +0 -1
  91. package/dist/shared/vector2.internal-DP1nTBdS.mjs.map +0 -1
  92. package/dist/shared/vector4.internal-BJ1QN2Ck.mjs +0 -246
  93. package/dist/shared/vector4.internal-BJ1QN2Ck.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"cubic-BL6dpuHh.mjs","names":["equals","make","fromVector","fromPoints","solve","toSolver","solveInverse","Solution.none","Solution.one","toInverseSolver","monotonicity","isMonotonic","isIncreasing","isDecreasing","asMonotonic","asIncreasing","asDecreasing","coefficients","derivative","antiderivative","domain","Interval.make","Solution.isNone","range","Interval.fromMinMax","unitRange","length","Interval.size","fromPoints","make","equals","fromVector","solve","toSolver","solveInverse","Linear.solveInverse","Linear.make","Solution.none","Solution.one","Solution.two","toInverseSolver","coefficients","derivative","roots","Solution.match","Vector2.make","monotonicity","Interval.size","Linear.monotonicity","Interval.contains","Interval.toOpen","Monotonicity.fromComparison","isMonotonic","Monotonicity.isStrict","isIncreasing","isDecreasing","asMonotonic","asIncreasing","asDecreasing","domain","Interval.fromMinMax","range","Linear.range","unitRange","Interval.unit","length","Linear.length","Linear.solve","curvature","make","isCubicPolynomial","equals","fromVector","fromPoints","solve","toSolver","solveInverse","Quadratic.solveInverse","Quadratic.make","Solution.fromArray","toInverseSolver","coefficients","derivative","subdivide","roots","extrema","Quadratic.roots","monotonicity","Interval.size","Linear.monotonicity","Linear.make","Quadratic.monotonicity","Interval.filter","Interval.toOpen","Monotonicity.fromComparison","isMonotonic","Monotonicity.isStrict","isIncreasing","isDecreasing","asMonotonic","asIncreasing","asDecreasing","domain","Interval.fromMinMax","range","unitRange","Interval.unit","length","Linear.length","Quadratic.length","Interval.scaleShift","Interval.biunit","Quadratic.solve","curvature","Quadratic.derivative","Linear.solve","internal.isCubicPolynomial","internal.equals","internal.make","internal.fromVector","internal.fromPoints","internal.solve","internal.toSolver","internal.solveInverse","internal.toInverseSolver","internal.coefficients","internal.derivative","internal.subdivide","internal.roots","internal.extrema","internal.monotonicity","internal.isMonotonic","internal.isIncreasing","internal.isDecreasing","internal.asMonotonic","internal.asIncreasing","internal.asDecreasing","internal.domain","internal.range","internal.unitRange","internal.length","internal.curvature"],"sources":["../../src/polynomial/quadratic.internal.circular.ts","../../src/polynomial/linear.internal.ts","../../src/polynomial/cubic.internal.circular.ts","../../src/polynomial/quadratic.internal.ts","../../src/length.ts","../../src/polynomial/cubic.internal.ts","../../src/polynomial/cubic.ts"],"sourcesContent":["import { Pipeable } from '../utils.ts'\nimport type { QuadraticPolynomial } from './quadratic.ts'\nimport { PolynomialTraits } from './traits.ts'\n\nexport const QuadraticPolynomialTypeId: unique symbol = Symbol.for('curvy/polynomial/quadratic')\nexport type QuadraticPolynomialTypeId = typeof QuadraticPolynomialTypeId\n\n/** @internal */\nexport class QuadraticPolynomialImpl extends Pipeable implements QuadraticPolynomial<unknown> {\n readonly [QuadraticPolynomialTypeId]: QuadraticPolynomialTypeId = QuadraticPolynomialTypeId\n declare readonly [PolynomialTraits]: unknown\n\n readonly c0: number\n readonly c1: number\n readonly c2: number\n\n constructor(c0 = 0, c1 = 0, c2 = 0) {\n super()\n\n this.c0 = c0\n this.c1 = c1\n this.c2 = c2\n }\n}\n","import * as Interval from '../interval/interval.ts'\nimport * as Monotonicity from '../monotonicity/monotonicity.ts'\nimport { dual, Pipeable } from '../utils.ts'\nimport * as Solution from '../solution/solution.ts'\nimport { invariant } from '../utils.ts'\nimport { epsEquals } from '../number.ts'\nimport type { Vector2 } from '../vector/vector2.ts'\nimport type { LinearPolynomial } from './linear.ts'\nimport type { Decreasing, Increasing, Monotonic } from './traits.ts'\nimport { PolynomialTraits } from './traits.ts'\nimport type { QuadraticPolynomial } from './quadratic.ts'\nimport { QuadraticPolynomialImpl } from './quadratic.internal.circular.ts'\n\nexport const LinearPolynomialTypeId: unique symbol = Symbol.for('curvy/linear')\nexport type LinearPolynomialTypeId = typeof LinearPolynomialTypeId\n\nclass LinearPolynomialImpl extends Pipeable implements LinearPolynomial<unknown> {\n readonly [LinearPolynomialTypeId]: LinearPolynomialTypeId = LinearPolynomialTypeId\n declare readonly [PolynomialTraits]: unknown\n\n readonly c0: number\n readonly c1: number\n\n constructor(c0 = 0, c1 = 0) {\n super()\n\n this.c0 = c0\n this.c1 = c1\n }\n}\n\n/** @internal */\nexport const isLinearPolynomial = (v: unknown): v is LinearPolynomial =>\n typeof v === 'object' && v !== null && LinearPolynomialTypeId in v\n\n/** @internal */\nexport const equals = dual<\n (b: LinearPolynomial) => (a: LinearPolynomial) => boolean,\n (a: LinearPolynomial, b: LinearPolynomial) => boolean\n>(2, (a: LinearPolynomial, b: LinearPolynomial) => epsEquals(a.c0, b.c0) && epsEquals(a.c1, b.c1))\n\n/** @internal */\nexport const make = (c0 = 0, c1 = 0): LinearPolynomial => new LinearPolynomialImpl(c0, c1)\n\n/** @internal */\nexport const fromVector = (v: Vector2) => new LinearPolynomialImpl(v.x, v.y)\n\n/** @internal */\nexport const fromPointSlope = (p: Vector2, slope: number) =>\n new LinearPolynomialImpl(p.y - slope * p.x, slope)\n\n/** @internal */\nexport const fromPoints = (p1: Vector2, p2: Vector2) =>\n fromPointSlope(p1, (p2.y - p1.y) / (p2.x - p1.x))\n\n/** @internal */\nexport const solve = dual<\n (x: number) => (p: LinearPolynomial) => number,\n (p: LinearPolynomial, x: number) => number\n>(2, (p: LinearPolynomial, x: number) => p.c0 + x * p.c1)\n\n/** @internal */\nexport const toSolver = (p: LinearPolynomial) => (x: number) => solve(p, x)\n\n/** @internal */\nexport const solveInverse = dual<\n (y: number) => (p: LinearPolynomial) => Solution.AtMostOne<number>,\n (p: LinearPolynomial, y: number) => Solution.AtMostOne<number>\n>(2, (p: LinearPolynomial, y: number) => {\n if (p.c1 === 0) {\n return Solution.none\n }\n return Solution.one((y - p.c0) / p.c1)\n})\n\n/** @internal */\nexport const toInverseSolver = (p: LinearPolynomial) => (y: number) => solveInverse(p, y)\n\n/** @internal */\nexport const monotonicity = (p: LinearPolynomial): Monotonicity.GuaranteedMonotonicity =>\n p.c1 === 0 ? Monotonicity.Constant : p.c1 > 0 ? Monotonicity.Increasing : Monotonicity.Decreasing\n\n/** @internal */\nexport const isMonotonic = <T>(p: LinearPolynomial<T>): p is LinearPolynomial<T & Monotonic> =>\n p.c1 !== 0\n\n/** @internal */\nexport const isIncreasing = <T>(p: LinearPolynomial<T>): p is LinearPolynomial<T & Increasing> =>\n p.c1 > 0\n\n/** @internal */\nexport const isDecreasing = <T>(p: LinearPolynomial<T>): p is LinearPolynomial<T & Decreasing> =>\n p.c1 < 0\n\n/** @internal */\nexport const asMonotonic = <T>(p: LinearPolynomial<T>): LinearPolynomial<T & Monotonic> => {\n invariant(isMonotonic(p), 'linear polynomial is not monotonic')\n return p\n}\n\n/** @internal */\nexport const asIncreasing = <T>(p: LinearPolynomial<T>): LinearPolynomial<T & Increasing> => {\n invariant(isIncreasing(p), 'linear polynomial is not increasing')\n return p\n}\n\n/** @internal */\nexport const asDecreasing = <T>(p: LinearPolynomial<T>): LinearPolynomial<T & Decreasing> => {\n invariant(isDecreasing(p), 'linear polynomial is not decreasing')\n return p\n}\n\n/** @internal */\nexport const coefficients = (p: LinearPolynomial): readonly [number, number] => [p.c0, p.c1]\n\n/** @internal */\nexport const derivative = (p: LinearPolynomial) => p.c1\n\n/** @internal */\nexport const antiderivative = dual<\n (integrationConstant: number) => (p: LinearPolynomial) => QuadraticPolynomial,\n (p: LinearPolynomial, integrationConstant?: number) => QuadraticPolynomial\n>(\n (args) => isLinearPolynomial(args[0]),\n (p: LinearPolynomial, integrationConstant = 0) =>\n new QuadraticPolynomialImpl(integrationConstant, p.c0, p.c1 / 2),\n)\n\n/** @internal */\nexport const domain = dual<\n (range: Interval.Interval) => (p: LinearPolynomial) => Solution.AtMostOne<Interval.Interval>,\n (p: LinearPolynomial, range: Interval.Interval) => Solution.AtMostOne<Interval.Interval>\n>(2, (p: LinearPolynomial, r: Interval.Interval) => {\n if (p.c1 === 0) {\n if (r.start === p.c0 && r.end === p.c0) {\n return Solution.one(Interval.make(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY))\n }\n return Solution.none\n }\n\n const start = solveInverse(p, r.start)\n const end = solveInverse(p, r.end)\n\n if (Solution.isNone(start) || Solution.isNone(end)) {\n return Solution.none\n }\n\n return Solution.one(Interval.make(start.value, end.value))\n})\n\n/** @internal */\nexport const range = dual<\n (domain: Interval.Interval) => (p: LinearPolynomial) => Interval.Closed,\n (p: LinearPolynomial, domain: Interval.Interval) => Interval.Closed\n>(2, (p: LinearPolynomial, d: Interval.Interval) =>\n Interval.fromMinMax(solve(p, d.start), solve(p, d.end)),\n)\n\n/** @internal */\nexport const unitRange = (p: LinearPolynomial): Interval.Closed =>\n Interval.fromMinMax(p.c0, p.c0 + p.c1)\n\n/** @internal */\nexport const length = dual<\n (domain: Interval.Interval) => (p: LinearPolynomial) => number,\n (p: LinearPolynomial, domain: Interval.Interval) => number\n>(2, (p: LinearPolynomial, d: Interval.Interval) => {\n if (Interval.size(d) === 0) {\n return 0\n }\n\n if (p.c1 === 0) {\n return Interval.size(d)\n }\n\n return Math.sqrt(1 + p.c1 ** 2) * Interval.size(d)\n})\n","import { Pipeable } from '../utils.ts'\nimport type { CubicPolynomial } from './cubic.ts'\nimport { PolynomialTraits } from './traits.ts'\n\nexport const CubicPolynomialTypeId: unique symbol = Symbol.for('curvy/polynomial/cubic')\nexport type CubicPolynomialTypeId = typeof CubicPolynomialTypeId\n\n/** @internal */\nexport class CubicPolynomialImpl extends Pipeable implements CubicPolynomial<unknown> {\n readonly [CubicPolynomialTypeId]: CubicPolynomialTypeId = CubicPolynomialTypeId\n declare readonly [PolynomialTraits]: unknown\n\n readonly c0: number\n readonly c1: number\n readonly c2: number\n readonly c3: number\n\n constructor(c0 = 0, c1 = 0, c2 = 0, c3 = 0) {\n super()\n\n this.c0 = c0\n this.c1 = c1\n this.c2 = c2\n this.c3 = c3\n }\n}\n","import * as Interval from '../interval/interval.ts'\nimport { dual } from '../utils.ts'\nimport * as Solution from '../solution/solution.ts'\nimport { invariant } from '../utils.ts'\nimport { epsEquals } from '../number.ts'\nimport * as Vector2 from '../vector/vector2.ts'\nimport type { Vector3 } from '../vector/vector3.ts'\nimport type { CubicPolynomial } from './cubic.ts'\nimport { CubicPolynomialImpl } from './cubic.internal.circular.ts'\nimport * as Linear from './linear.internal.ts'\nimport * as Monotonicity from '../monotonicity/monotonicity.ts'\nimport type { QuadraticPolynomial } from './quadratic.ts'\nimport {\n QuadraticPolynomialImpl,\n QuadraticPolynomialTypeId,\n} from './quadratic.internal.circular.ts'\nimport type { Decreasing, Increasing, Monotonic } from './traits.ts'\n\n/** @internal */\nexport const fromPoints = (\n p0: Vector2.Vector2,\n p1: Vector2.Vector2,\n p2: Vector2.Vector2,\n): QuadraticPolynomial => {\n // Newton's divided differences, then collected to monomial form.\n const f01 = (p1.y - p0.y) / (p1.x - p0.x)\n const f12 = (p2.y - p1.y) / (p2.x - p1.x)\n const f012 = (f12 - f01) / (p2.x - p0.x)\n\n return new QuadraticPolynomialImpl(\n p0.y - f01 * p0.x + f012 * p0.x * p1.x,\n f01 - f012 * (p0.x + p1.x),\n f012,\n )\n}\n\n/** @internal */\nexport const make = (c0 = 0, c1 = 0, c2 = 0): QuadraticPolynomial =>\n new QuadraticPolynomialImpl(c0, c1, c2)\n\n/** @internal */\nexport const isQuadraticPolynomial = (v: unknown): v is QuadraticPolynomial =>\n typeof v === 'object' && v !== null && QuadraticPolynomialTypeId in v\n\n/** @internal */\nexport const equals = dual<\n (b: QuadraticPolynomial) => (a: QuadraticPolynomial) => boolean,\n (a: QuadraticPolynomial, b: QuadraticPolynomial) => boolean\n>(\n 2,\n (a: QuadraticPolynomial, b: QuadraticPolynomial) =>\n epsEquals(a.c0, b.c0) && epsEquals(a.c1, b.c1) && epsEquals(a.c2, b.c2),\n)\n\n/** @internal */\nexport const fromVector = (v: Vector3) => new QuadraticPolynomialImpl(v.x, v.y, v.z)\n\n/** @internal */\nexport const solve = dual<\n (x: number) => (p: QuadraticPolynomial) => number,\n (p: QuadraticPolynomial, x: number) => number\n>(2, (p: QuadraticPolynomial, x: number) => p.c0 + x * p.c1 + x ** 2 * p.c2)\n\n/** @internal */\nexport const toSolver = (p: QuadraticPolynomial) => (x: number) => solve(p, x)\n\n/** @internal */\nexport const solveInverse: {\n (p: QuadraticPolynomial, y: number): Solution.AtMostTwo<number>\n (y: number): (p: QuadraticPolynomial) => Solution.AtMostTwo<number>\n} = dual<\n (y: number) => (p: QuadraticPolynomial) => Solution.AtMostTwo<number>,\n (p: QuadraticPolynomial, y: number) => Solution.AtMostTwo<number>\n>(2, (p: QuadraticPolynomial, y: number) => {\n // c2 = 0: the polynomial is actually linear in disguise. Defer rather than\n // dividing by zero in the quadratic formula.\n if (p.c2 === 0) {\n return Linear.solveInverse(Linear.make(p.c0, p.c1), y)\n }\n\n const discriminant = p.c1 ** 2 - 4 * p.c2 * (p.c0 - y)\n\n if (discriminant < 0) {\n return Solution.none\n }\n\n if (discriminant === 0) {\n return Solution.one(-p.c1 / (2 * p.c2))\n }\n\n const sqrtDiscriminant = Math.sqrt(discriminant)\n const a = (-p.c1 + sqrtDiscriminant) / (2 * p.c2)\n const b = (-p.c1 - sqrtDiscriminant) / (2 * p.c2)\n return a < b ? Solution.two(a, b) : Solution.two(b, a)\n})\n\n/** @internal */\nexport const toInverseSolver =\n (p: QuadraticPolynomial) =>\n (y: number): Solution.AtMostTwo<number> =>\n solveInverse(p, y)\n\n/** @internal */\nexport const coefficients = (p: QuadraticPolynomial): readonly [number, number, number] => [\n p.c0,\n p.c1,\n p.c2,\n]\n\n/** @internal */\nexport const derivative = (p: QuadraticPolynomial) => Linear.make(p.c1, p.c2 * 2)\n\n/** @internal */\nexport const roots = (p: QuadraticPolynomial) => solveInverse(p, 0)\n\n/** @internal */\nexport const extreme = (p: QuadraticPolynomial) =>\n derivative(p).pipe(\n Linear.solveInverse(0),\n Solution.match({\n onNone: () => null,\n onSome: ({ value: t }) => Vector2.make(t, solve(p, t)),\n }),\n )\n\n/** @internal */\nexport const monotonicity = dual<\n (i: Interval.Interval) => (p: QuadraticPolynomial) => Monotonicity.Monotonicity,\n (p: QuadraticPolynomial, i?: Interval.Interval) => Monotonicity.Monotonicity\n>(\n (args) => isQuadraticPolynomial(args[0]),\n (p: QuadraticPolynomial, i?: Interval.Interval) => {\n invariant(\n i === undefined || Interval.size(i) > 0,\n 'monotonicity is undefined over a zero-width interval',\n )\n\n if (p.c2 === 0 && p.c1 === 0) {\n return Monotonicity.Constant\n }\n\n if (p.c2 === 0) {\n return Linear.monotonicity(Linear.make(p.c0, p.c1))\n }\n\n // c2 is non-zero, so the extreme is guaranteed to be non-null\n const e = extreme(p) as Vector2.Vector2\n\n // if there is no interval, or the extreme is within the interval,\n // the monotonicity is none\n if (i === undefined || Interval.contains(Interval.toOpen(i), e.x)) {\n return Monotonicity.None\n }\n\n return Monotonicity.fromComparison(solve(p, i.start), solve(p, i.end))\n },\n)\n\n/** @internal */\nexport const isMonotonic = dual<\n (\n i: Interval.Interval,\n ) => <T>(p: QuadraticPolynomial<T>) => p is QuadraticPolynomial<T & Monotonic>,\n <T>(p: QuadraticPolynomial<T>, i?: Interval.Interval) => p is QuadraticPolynomial<T & Monotonic>\n>((args) => isQuadraticPolynomial(args[0]), ((p: QuadraticPolynomial, i?: Interval.Interval) =>\n Monotonicity.isStrict(monotonicity(p, i as Interval.Interval))) as never)\n\n/** @internal */\nexport const isIncreasing = dual<\n (\n i: Interval.Interval,\n ) => <T>(p: QuadraticPolynomial<T>) => p is QuadraticPolynomial<T & Increasing>,\n <T>(p: QuadraticPolynomial<T>, i?: Interval.Interval) => p is QuadraticPolynomial<T & Increasing>\n>(\n (args) => isQuadraticPolynomial(args[0]),\n ((p: QuadraticPolynomial, i?: Interval.Interval) =>\n monotonicity(p, i as Interval.Interval) === Monotonicity.Increasing) as never,\n)\n\n/** @internal */\nexport const isDecreasing = dual<\n (\n i: Interval.Interval,\n ) => <T>(p: QuadraticPolynomial<T>) => p is QuadraticPolynomial<T & Decreasing>,\n <T>(p: QuadraticPolynomial<T>, i?: Interval.Interval) => p is QuadraticPolynomial<T & Decreasing>\n>(\n (args) => isQuadraticPolynomial(args[0]),\n ((p: QuadraticPolynomial, i?: Interval.Interval) =>\n monotonicity(p, i as Interval.Interval) === Monotonicity.Decreasing) as never,\n)\n\n/** @internal */\nexport const asMonotonic = <T>(\n p: QuadraticPolynomial<T>,\n i?: Interval.Interval,\n): QuadraticPolynomial<T & Monotonic> => {\n invariant(isMonotonic(p, i as Interval.Interval), 'quadratic polynomial is not monotonic')\n return p\n}\n\n/** @internal */\nexport const asIncreasing = <T>(\n p: QuadraticPolynomial<T>,\n i?: Interval.Interval,\n): QuadraticPolynomial<T & Increasing> => {\n invariant(isIncreasing(p, i as Interval.Interval), 'quadratic polynomial is not increasing')\n return p\n}\n\n/** @internal */\nexport const asDecreasing = <T>(\n p: QuadraticPolynomial<T>,\n i?: Interval.Interval,\n): QuadraticPolynomial<T & Decreasing> => {\n invariant(isDecreasing(p, i as Interval.Interval), 'quadratic polynomial is not decreasing')\n return p\n}\n\n/** @internal */\nexport const antiderivative = dual<\n (integrationConstant: number) => (p: QuadraticPolynomial) => CubicPolynomial,\n (p: QuadraticPolynomial, integrationConstant?: number) => CubicPolynomial\n>(\n 2,\n (p: QuadraticPolynomial, integrationConstant = 0) =>\n new CubicPolynomialImpl(integrationConstant, p.c0, p.c1 / 2, p.c2 / 3),\n)\n\n/** @internal */\nexport const domain = dual<\n (range: Interval.Interval) => (p: QuadraticPolynomial) => Solution.AtMostOne<Interval.Interval>,\n (p: QuadraticPolynomial, range: Interval.Interval) => Solution.AtMostOne<Interval.Interval>\n>(2, (p: QuadraticPolynomial, r: Interval.Interval) => {\n const start = solveInverse(p, r.start)\n const end = solveInverse(p, r.end)\n\n if (start.length === 0 && end.length === 0) {\n return Solution.none\n }\n\n return Solution.one(Interval.fromMinMax(...start, ...end))\n})\n\n/** @internal */\nexport const range = dual<\n (domain: Interval.Interval) => (p: QuadraticPolynomial) => Interval.Closed,\n (p: QuadraticPolynomial, domain: Interval.Interval) => Interval.Closed\n>(2, (p: QuadraticPolynomial, d: Interval.Interval) => {\n if (p.c2 === 0) {\n return Linear.range(Linear.make(p.c0, p.c1), d)\n }\n\n const e = extreme(p)\n\n return e !== null && Interval.contains(d, e.x)\n ? Interval.fromMinMax(solve(p, d.start), solve(p, d.end), e.y)\n : Interval.fromMinMax(solve(p, d.start), solve(p, d.end))\n})\n\n/** @internal */\nexport const unitRange = (p: QuadraticPolynomial): Interval.Closed => range(p, Interval.unit)\n\n/** @internal */\nexport const length = dual<\n (domain: Interval.Interval) => (p: QuadraticPolynomial) => number,\n (p: QuadraticPolynomial, domain: Interval.Interval) => number\n>(2, (p: QuadraticPolynomial, dom: Interval.Interval) => {\n if (Interval.size(dom) === 0) {\n return 0\n }\n\n if (p.c2 === 0) {\n return Linear.length(Linear.make(p.c0, p.c1), dom)\n }\n\n const dp = derivative(p)\n\n const derivativeStart = Linear.solve(dp, dom.start)\n const sqrtStart = Math.sqrt(1 + derivativeStart ** 2)\n const evalStart =\n (derivativeStart * sqrtStart + Math.log(Math.abs(derivativeStart + sqrtStart))) / (4 * p.c2)\n\n const derivativeEnd = Linear.solve(dp, dom.end)\n const sqrtEnd = Math.sqrt(1 + derivativeEnd ** 2)\n const evalEnd =\n (derivativeEnd * sqrtEnd + Math.log(Math.abs(derivativeEnd + sqrtEnd))) / (4 * p.c2)\n\n return evalEnd - evalStart\n})\n\n/** @internal */\nexport const curvature = dual<\n (x: number) => (p: QuadraticPolynomial) => number,\n (p: QuadraticPolynomial, x: number) => number\n>(\n 2,\n (p: QuadraticPolynomial, x: number) =>\n Math.abs(2 * p.c2) / (1 + (Linear.solve(derivative(p), x) ** 2) ** 1.5),\n)\n","export const GL32_X0 = 0.9972638618494816\nexport const GL32_X1 = 0.9856115115452684\nexport const GL32_X2 = 0.9647622555875064\nexport const GL32_X3 = 0.9349060759377397\nexport const GL32_X4 = 0.8963211557660521\nexport const GL32_X5 = 0.84936761373257\nexport const GL32_X6 = 0.7944837959679424\nexport const GL32_X7 = 0.7321821187402897\nexport const GL32_X8 = 0.6630442669302152\nexport const GL32_X9 = 0.5877157572407623\nexport const GL32_X10 = 0.5068999089322294\nexport const GL32_X11 = 0.42135127613063533\nexport const GL32_X12 = 0.33186860228212767\nexport const GL32_X13 = 0.23928736225213706\nexport const GL32_X14 = 0.1444719615827965\nexport const GL32_X15 = 0.04830766568773831\nexport const GL32_W0 = 0.007018610009470136\nexport const GL32_W1 = 0.01627439473090571\nexport const GL32_W2 = 0.02539206530926214\nexport const GL32_W3 = 0.03427386291302141\nexport const GL32_W4 = 0.042835898022226704\nexport const GL32_W5 = 0.050998059262376154\nexport const GL32_W6 = 0.05868409347853558\nexport const GL32_W7 = 0.06582222277636195\nexport const GL32_W8 = 0.07234579410884862\nexport const GL32_W9 = 0.07819389578707044\nexport const GL32_W10 = 0.08331192422694672\nexport const GL32_W11 = 0.08765209300440374\nexport const GL32_W12 = 0.0911738786957639\nexport const GL32_W13 = 0.09384439908080454\nexport const GL32_W14 = 0.09563872007927485\nexport const GL32_W15 = 0.09654008851472785\n","import * as Interval from '../interval/interval.ts'\nimport {\n GL32_W0,\n GL32_W1,\n GL32_W2,\n GL32_W3,\n GL32_W4,\n GL32_W5,\n GL32_W6,\n GL32_W7,\n GL32_W8,\n GL32_W9,\n GL32_W10,\n GL32_W11,\n GL32_W12,\n GL32_W13,\n GL32_W14,\n GL32_W15,\n GL32_X0,\n GL32_X1,\n GL32_X2,\n GL32_X3,\n GL32_X4,\n GL32_X5,\n GL32_X6,\n GL32_X7,\n GL32_X8,\n GL32_X9,\n GL32_X10,\n GL32_X11,\n GL32_X12,\n GL32_X13,\n GL32_X14,\n GL32_X15,\n} from '../length.ts'\nimport * as Monotonicity from '../monotonicity/monotonicity.ts'\nimport { dual } from '../utils.ts'\nimport * as Solution from '../solution/solution.ts'\nimport { invariant } from '../utils.ts'\nimport { clampToZero, epsEquals } from '../number.ts'\nimport type * as Vector2 from '../vector/vector2.ts'\nimport type { Vector4 } from '../vector/vector4.ts'\nimport type { CubicPolynomial } from './cubic.ts'\nimport { CubicPolynomialImpl, CubicPolynomialTypeId } from './cubic.internal.circular.ts'\nimport type { Decreasing, Increasing, Monotonic } from './traits.ts'\nimport * as Linear from './linear.internal.ts'\nimport * as Quadratic from './quadratic.internal.ts'\n\n/** @internal */\nexport const make = (c0 = 0, c1 = 0, c2 = 0, c3 = 0): CubicPolynomial =>\n new CubicPolynomialImpl(c0, c1, c2, c3)\n\n/** @internal */\nexport const isCubicPolynomial = (v: unknown): v is CubicPolynomial =>\n typeof v === 'object' && v !== null && CubicPolynomialTypeId in v\n\n/** @internal */\nexport const equals = dual<\n (b: CubicPolynomial) => (a: CubicPolynomial) => boolean,\n (a: CubicPolynomial, b: CubicPolynomial) => boolean\n>(\n 2,\n (a: CubicPolynomial, b: CubicPolynomial) =>\n epsEquals(a.c0, b.c0) &&\n epsEquals(a.c1, b.c1) &&\n epsEquals(a.c2, b.c2) &&\n epsEquals(a.c3, b.c3),\n)\n\n/** @internal */\nexport const fromVector = (v: Vector4) => new CubicPolynomialImpl(v.x, v.y, v.z, v.w)\n\n/** @internal */\nexport const fromPoints = (\n p0: Vector2.Vector2,\n p1: Vector2.Vector2,\n p2: Vector2.Vector2,\n p3: Vector2.Vector2,\n): CubicPolynomial => {\n // Newton's divided differences, then collected to monomial form.\n const f01 = (p1.y - p0.y) / (p1.x - p0.x)\n const f12 = (p2.y - p1.y) / (p2.x - p1.x)\n const f23 = (p3.y - p2.y) / (p3.x - p2.x)\n const f012 = (f12 - f01) / (p2.x - p0.x)\n const f123 = (f23 - f12) / (p3.x - p1.x)\n const f0123 = (f123 - f012) / (p3.x - p0.x)\n\n return new CubicPolynomialImpl(\n p0.y - f01 * p0.x + f012 * p0.x * p1.x - f0123 * p0.x * p1.x * p2.x,\n f01 - f012 * (p0.x + p1.x) + f0123 * (p0.x * p1.x + p0.x * p2.x + p1.x * p2.x),\n f012 - f0123 * (p0.x + p1.x + p2.x),\n f0123,\n )\n}\n\n/** @internal */\nexport const solve = dual<\n (x: number) => (p: CubicPolynomial) => number,\n (p: CubicPolynomial, x: number) => number\n>(2, (p: CubicPolynomial, x: number) => p.c0 + x * p.c1 + x ** 2 * p.c2 + x ** 3 * p.c3)\n\n/** @internal */\nexport const toSolver = (p: CubicPolynomial) => (x: number) => solve(p, x)\n\n/** @internal */\nexport const solveInverse = dual<\n (y: number) => (p: CubicPolynomial) => Solution.AtMostThree<number>,\n (p: CubicPolynomial, y: number) => Solution.AtMostThree<number>\n>(2, (self: CubicPolynomial, y: number) => {\n // c3 = 0: the polynomial is actually quadratic-or-less in disguise. Defer to\n // the quadratic solver (which itself handles c2 = 0 by deferring to linear).\n if (self.c3 === 0) {\n return Quadratic.solveInverse(Quadratic.make(self.c0, self.c1, self.c2), y)\n }\n\n const shift = self.c2 / (3 * self.c3)\n\n const d0 = self.c2 ** 2 - 3 * self.c3 * self.c1\n const d1 = 2 * self.c2 ** 3 - 9 * self.c3 * self.c2 * self.c1 + 27 * self.c3 ** 2 * (self.c0 - y)\n\n const p = -d0 / (3 * self.c3 ** 2)\n const q = d1 / (27 * self.c3 ** 3)\n\n const discriminant = clampToZero(-(4 * p ** 3 + 27 * q ** 2), 1e-12)\n\n const roots = new Set<number>()\n\n if (discriminant > 0) {\n const r = 2 * Math.sqrt(-p / 3)\n const theta = Math.acos(((3 * q) / (2 * p)) * Math.sqrt(-3 / p)) / 3\n const offset = (2 * Math.PI) / 3\n\n roots.add(r * Math.cos(theta + offset) - shift)\n roots.add(r * Math.cos(theta) - shift)\n roots.add(r * Math.cos(theta - offset) - shift)\n } else if (discriminant < 0) {\n const u = Math.sqrt(q ** 2 / 4 + p ** 3 / 27)\n\n const u1 = Math.cbrt(-q / 2 + u)\n const u2 = Math.cbrt(-q / 2 - u)\n\n roots.add(u1 + u2 - shift)\n } else if (d0 === 0) {\n roots.add(-shift)\n } else {\n roots.add((9 * self.c3 * (self.c0 - y) - self.c2 * self.c1) / (2 * d0))\n roots.add(\n (4 * self.c3 * self.c2 * self.c1 - 9 * self.c3 ** 2 * (self.c0 - y) - self.c2 ** 3) /\n (self.c3 * d0),\n )\n }\n\n return Solution.fromArray(Array.from(roots).toSorted((a, b) => a - b))\n})\n\n/** @internal */\nexport const toInverseSolver = (p: CubicPolynomial) => (y: number) => solveInverse(p, y)\n\n/** @internal */\nexport const coefficients = (p: CubicPolynomial): readonly [number, number, number, number] => [\n p.c0,\n p.c1,\n p.c2,\n p.c3,\n]\n\n/** @internal */\nexport const derivative = (p: CubicPolynomial) => Quadratic.make(p.c1, p.c2 * 2, p.c3 * 3)\n\n// Subdivides a cubic polynomial at parameter `t ∈ (0, 1)` into two new cubic\n// polynomials. The first polynomial's evaluation on `[0, 1]` matches the\n// original's evaluation on `[0, t]`; the second matches the original's\n// evaluation on `[t, 1]`. Concretely: `left(u) = p(t·u)` and\n// `right(u) = p(t + (1-t)·u)`. The left half is a uniform scale of the input\n// parameter by powers of `t`; the right half is a binomial expansion in\n// `(s + r·u)` with `s = t` and `r = 1 - t`.\n/** @internal */\nexport const subdivide = dual<\n (t: number) => (p: CubicPolynomial) => [CubicPolynomial, CubicPolynomial],\n (p: CubicPolynomial, t: number) => [CubicPolynomial, CubicPolynomial]\n>(2, (p: CubicPolynomial, t: number): [CubicPolynomial, CubicPolynomial] => {\n invariant(t > 0 && t < 1, 'subdivide parameter t must be in the open interval (0, 1)')\n\n const r = 1 - t\n const left = make(p.c0, p.c1 * t, p.c2 * t * t, p.c3 * t * t * t)\n const right = make(\n p.c0 + p.c1 * t + p.c2 * t * t + p.c3 * t * t * t,\n p.c1 * r + 2 * p.c2 * t * r + 3 * p.c3 * t * t * r,\n p.c2 * r * r + 3 * p.c3 * t * r * r,\n p.c3 * r * r * r,\n )\n return [left, right]\n})\n\n/** @internal */\nexport const roots = (p: CubicPolynomial): Solution.AtMostThree<number> => solveInverse(p, 0)\n\n/** @internal */\nexport const extrema = (p: CubicPolynomial): Solution.AtMostTwo<number> =>\n Quadratic.roots(derivative(p))\n\n/** @internal */\nexport const monotonicity = dual<\n (i: Interval.Interval) => (p: CubicPolynomial) => Monotonicity.Monotonicity,\n (p: CubicPolynomial, i?: Interval.Interval) => Monotonicity.Monotonicity\n>(\n (args) => isCubicPolynomial(args[0]),\n (p: CubicPolynomial, i?: Interval.Interval) => {\n invariant(\n i === undefined || Interval.size(i) > 0,\n 'monotonicity is undefined over a zero-width interval',\n )\n\n // shortcut to check for a horizontal line\n if (p.c3 === 0 && p.c2 === 0 && p.c1 === 0) {\n return Monotonicity.Constant\n }\n\n // shortcut to check for a non-horizontal line\n if (p.c3 === 0 && p.c2 === 0) {\n return Linear.monotonicity(Linear.make(p.c0, p.c1))\n }\n\n // without an interval, the monotonicity will be none if c3 or c2 are nonzero\n if (i === undefined) {\n return Monotonicity.None\n }\n\n if (p.c3 === 0) {\n return Quadratic.monotonicity(Quadratic.make(p.c0, p.c1, p.c2), i)\n }\n\n const e = Interval.filter(Interval.toOpen(i), [...extrema(p)])\n\n if (e.length > 0) {\n return Monotonicity.None\n }\n\n return Monotonicity.fromComparison(solve(p, i.start), solve(p, i.end))\n },\n)\n\n/** @internal */\nexport const isMonotonic = dual<\n (i: Interval.Interval) => <T>(p: CubicPolynomial<T>) => p is CubicPolynomial<T & Monotonic>,\n <T>(p: CubicPolynomial<T>, i?: Interval.Interval) => p is CubicPolynomial<T & Monotonic>\n>((args) => isCubicPolynomial(args[0]), ((p: CubicPolynomial, i?: Interval.Interval) =>\n Monotonicity.isStrict(monotonicity(p, i as Interval.Interval))) as never)\n\n/** @internal */\nexport const isIncreasing = dual<\n (i: Interval.Interval) => <T>(p: CubicPolynomial<T>) => p is CubicPolynomial<T & Increasing>,\n <T>(p: CubicPolynomial<T>, i?: Interval.Interval) => p is CubicPolynomial<T & Increasing>\n>(\n (args) => isCubicPolynomial(args[0]),\n ((p: CubicPolynomial, i?: Interval.Interval) =>\n monotonicity(p, i as Interval.Interval) === Monotonicity.Increasing) as never,\n)\n\n/** @internal */\nexport const isDecreasing = dual<\n (i: Interval.Interval) => <T>(p: CubicPolynomial<T>) => p is CubicPolynomial<T & Decreasing>,\n <T>(p: CubicPolynomial<T>, i?: Interval.Interval) => p is CubicPolynomial<T & Decreasing>\n>(\n (args) => isCubicPolynomial(args[0]),\n ((p: CubicPolynomial, i?: Interval.Interval) =>\n monotonicity(p, i as Interval.Interval) === Monotonicity.Decreasing) as never,\n)\n\n/** @internal */\nexport const asMonotonic = <T>(\n p: CubicPolynomial<T>,\n i?: Interval.Interval,\n): CubicPolynomial<T & Monotonic> => {\n invariant(isMonotonic(p, i as Interval.Interval), 'cubic polynomial is not monotonic')\n return p\n}\n\n/** @internal */\nexport const asIncreasing = <T>(\n p: CubicPolynomial<T>,\n i?: Interval.Interval,\n): CubicPolynomial<T & Increasing> => {\n invariant(isIncreasing(p, i as Interval.Interval), 'cubic polynomial is not increasing')\n return p\n}\n\n/** @internal */\nexport const asDecreasing = <T>(\n p: CubicPolynomial<T>,\n i?: Interval.Interval,\n): CubicPolynomial<T & Decreasing> => {\n invariant(isDecreasing(p, i as Interval.Interval), 'cubic polynomial is not decreasing')\n return p\n}\n\n/** @internal */\nexport const domain = dual<\n (range: Interval.Interval) => (p: CubicPolynomial) => Interval.Interval,\n (p: CubicPolynomial, range: Interval.Interval) => Interval.Interval\n>(2, (p: CubicPolynomial, r: Interval.Interval) =>\n Interval.fromMinMax(...solveInverse(p, r.start), ...solveInverse(p, r.end)),\n)\n\n/** @internal */\nexport const range = dual<\n (domain: Interval.Interval) => (p: CubicPolynomial) => Interval.Closed,\n (p: CubicPolynomial, domain: Interval.Interval) => Interval.Closed\n>(2, (p: CubicPolynomial, d: Interval.Interval) =>\n Interval.fromMinMax(\n solve(p, d.start),\n solve(p, d.end),\n ...Interval.filter(d, [...extrema(p)]).map((e) => solve(p, e)),\n ),\n)\n\n/** @internal */\nexport const unitRange = (p: CubicPolynomial): Interval.Closed => range(p, Interval.unit)\n\n/** @internal */\nexport const length = dual<\n (domain: Interval.Interval) => (p: CubicPolynomial) => number,\n (p: CubicPolynomial, domain: Interval.Interval) => number\n>(2, (p: CubicPolynomial, dom: Interval.Interval) => {\n if (Interval.size(dom) === 0) {\n return 0\n }\n\n if (p.c3 === 0) {\n if (p.c2 === 0) {\n return Linear.length(Linear.make(p.c0, p.c1), dom)\n }\n\n return Quadratic.length(Quadratic.make(p.c0, p.c1, p.c2), dom)\n }\n\n const d = derivative(p)\n\n const { scale, shift } = Interval.scaleShift(Interval.biunit, dom)\n\n return (\n (GL32_W0 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X0) ** 2) +\n GL32_W0 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X0) ** 2) +\n GL32_W1 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X1) ** 2) +\n GL32_W1 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X1) ** 2) +\n GL32_W2 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X2) ** 2) +\n GL32_W2 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X2) ** 2) +\n GL32_W3 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X3) ** 2) +\n GL32_W3 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X3) ** 2) +\n GL32_W4 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X4) ** 2) +\n GL32_W4 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X4) ** 2) +\n GL32_W5 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X5) ** 2) +\n GL32_W5 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X5) ** 2) +\n GL32_W6 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X6) ** 2) +\n GL32_W6 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X6) ** 2) +\n GL32_W7 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X7) ** 2) +\n GL32_W7 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X7) ** 2) +\n GL32_W8 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X8) ** 2) +\n GL32_W8 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X8) ** 2) +\n GL32_W9 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X9) ** 2) +\n GL32_W9 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X9) ** 2) +\n GL32_W10 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X10) ** 2) +\n GL32_W10 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X10) ** 2) +\n GL32_W11 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X11) ** 2) +\n GL32_W11 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X11) ** 2) +\n GL32_W12 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X12) ** 2) +\n GL32_W12 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X12) ** 2) +\n GL32_W13 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X13) ** 2) +\n GL32_W13 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X13) ** 2) +\n GL32_W14 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X14) ** 2) +\n GL32_W14 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X14) ** 2) +\n GL32_W15 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * -GL32_X15) ** 2) +\n GL32_W15 * Math.sqrt(1 + Quadratic.solve(d, shift + scale * GL32_X15) ** 2)) *\n scale\n )\n})\n\n/** @internal */\nexport const curvature = dual(2, (p: CubicPolynomial, x: number) => {\n const d = derivative(p)\n const dd = Quadratic.derivative(d)\n\n return Math.abs(Linear.solve(dd, x)) / (1 + Quadratic.solve(d, x) ** 2) ** 1.5\n})\n","import type { Closed, Interval } from '../interval/interval.ts'\nimport type { Pipeable } from '../utils.ts'\nimport type * as Solution from '../solution/solution.ts'\nimport type { Vector2 } from '../vector/vector2.ts'\nimport type { Vector4 } from '../vector/vector4.ts'\nimport * as internal from './cubic.internal.ts'\nimport type { CubicPolynomialTypeId } from './cubic.internal.circular.ts'\nimport type { Monotonicity } from '../monotonicity/monotonicity.ts'\nimport type { QuadraticPolynomial } from './quadratic.ts'\nimport type { Decreasing, Increasing, Monotonic, PolynomialTraits } from './traits.ts'\n\nexport type { Monotonic, Increasing, Decreasing } from './traits.ts'\n\n/**\n * A cubic polynomial.\n *\n * All fields are readonly and immutable, and all operations create new instances.\n *\n * The `Traits` type parameter is a phantom marker that accumulates trait\n * brands as the polynomial is refined via `isMonotonic` / `asMonotonic` and\n * friends. A cubic is monotonic only over an interval that avoids both of its\n * extrema (or globally, when c2 = c3 = 0 and c1 ≠ 0).\n *\n * @since 1.0.0\n */\nexport interface CubicPolynomial<out Traits = unknown> extends Pipeable {\n readonly [CubicPolynomialTypeId]: CubicPolynomialTypeId\n readonly [PolynomialTraits]: Traits\n\n /**\n * The coefficient of the x^0 term.\n */\n readonly c0: number\n /**\n * The coefficient of the x^1 term.\n */\n readonly c1: number\n /**\n * The coefficient of the x^2 term.\n */\n readonly c2: number\n /**\n * The coefficient of the x^3 term.\n */\n readonly c3: number\n}\n\n/**\n * Checks if a value is a `CubicPolynomial`.\n *\n * @param value - The value to check.\n * @returns `true` if the value is a `CubicPolynomial`, `false` otherwise.\n * @since 1.0.0\n */\nexport const isCubicPolynomial: (value: unknown) => value is CubicPolynomial =\n internal.isCubicPolynomial\n\nexport const equals: {\n /**\n * Checks if two `CubicPolynomial` instances are approximately equal within\n * the default absolute tolerance ({@link EPSILON}).\n *\n * @param a - The first polynomial.\n * @param b - The second polynomial.\n * @returns `true` when each pair of coefficients is within tolerance.\n * @since 1.1.0\n */\n (a: CubicPolynomial, b: CubicPolynomial): boolean\n /**\n * Checks if two `CubicPolynomial` instances are approximately equal within\n * the default absolute tolerance ({@link EPSILON}).\n *\n * @param b - The second polynomial.\n * @returns A function that takes the first polynomial and returns the comparison result.\n * @since 1.1.0\n */\n (b: CubicPolynomial): (a: CubicPolynomial) => boolean\n} = internal.equals\n\n/**\n * Creates a new `CubicPolynomial` instance.\n *\n * @param c0 - The coefficient of the x^0 term.\n * @param c1 - The coefficient of the x^1 term.\n * @param c2 - The coefficient of the x^2 term.\n * @param c3 - The coefficient of the x^3 term.\n */\nexport const make: (c0: number, c1: number, c2: number, c3: number) => CubicPolynomial =\n internal.make\n\n/**\n * Creates a new `CubicPolynomial` instance from a vector.\n *\n * @param v - The vector to convert.\n * @returns A new `CubicPolynomial` instance.\n * @since 1.0.0\n */\nexport const fromVector: (v: Vector4) => CubicPolynomial = internal.fromVector\n\n/**\n * Creates a new `CubicPolynomial` that interpolates the four given points,\n * treating each `Vector2` as an `(x, y)` pair. The four input `x` values must\n * be distinct.\n *\n * @param p0 - The first point.\n * @param p1 - The second point.\n * @param p2 - The third point.\n * @param p3 - The fourth point.\n * @returns The unique cubic polynomial passing through the four points.\n * @since 2.0.0\n */\nexport const fromPoints: (p0: Vector2, p1: Vector2, p2: Vector2, p3: Vector2) => CubicPolynomial =\n internal.fromPoints\n\nexport const solve: {\n /**\n * Solves a cubic polynomial for a given value of x.\n *\n * @param p - The cubic polynomial to solve.\n * @param x - The value of x to solve for.\n * @returns The result of the polynomial evaluation at x.\n * @since 1.0.0\n */\n (p: CubicPolynomial, x: number): number\n /**\n * Solves a cubic polynomial for a given value of x.\n *\n * @param x - The value of x to solve for.\n * @returns A function that takes a cubic polynomial and returns the result of the polynomial evaluation at x.\n * @since 1.0.0\n */\n (x: number): (p: CubicPolynomial) => number\n} = internal.solve\n\n/**\n * Converts a cubic polynomial to a solver function.\n *\n * @param p - The cubic polynomial to convert.\n * @returns A function that takes a value of x and returns the result of the polynomial evaluation at x.\n * @since 1.0.0\n */\nexport const toSolver: (p: CubicPolynomial) => (x: number) => number = internal.toSolver\n\nexport const solveInverse: {\n /**\n * Solves a monotonic cubic polynomial for a given value of y. Because the\n * polynomial is strictly monotonic, the inverse has at most one solution.\n *\n * @param p - The monotonic cubic polynomial.\n * @param y - The value of y to solve for.\n * @returns Zero or one solutions.\n * @since 2.0.0\n */\n <T extends Monotonic>(p: CubicPolynomial<T>, y: number): Solution.AtMostOne<number>\n /**\n * Solves a cubic polynomial for a given value of y.\n *\n * @param p - The cubic polynomial to solve.\n * @param y - The value of y to solve for.\n * @returns The roots of the polynomial equation p(x) = y.\n * @since 1.0.0\n */\n <T>(p: CubicPolynomial<T>, y: number): Solution.AtMostThree<number>\n /**\n * Solves a cubic polynomial for a given value of y.\n *\n * @param y - The value of y to solve for.\n * @returns A function that takes a cubic polynomial and returns the roots\n * of the polynomial equation p(x) = y. Tightens to `Solution.AtMostOne<number>` for\n * monotonic inputs.\n * @since 1.0.0\n */\n (y: number): {\n <T extends Monotonic>(p: CubicPolynomial<T>): Solution.AtMostOne<number>\n <T>(p: CubicPolynomial<T>): Solution.AtMostThree<number>\n }\n} = internal.solveInverse as never\n\n/**\n * Converts a cubic polynomial to an inverse solver function.\n *\n * @param p - The cubic polynomial to convert.\n * @returns A function that takes a value of y and returns the roots of the polynomial equation p(x) = y.\n * @since 1.0.0\n */\nexport const toInverseSolver: (p: CubicPolynomial) => (y: number) => Solution.AtMostThree<number> =\n internal.toInverseSolver\n\n/**\n * Returns the polynomial's coefficients as a tuple `[c0, c1, c2, c3]`.\n *\n * @param p - The cubic polynomial.\n * @returns The coefficients in monomial order.\n * @since 2.0.0\n */\nexport const coefficients: (p: CubicPolynomial) => readonly [number, number, number, number] =\n internal.coefficients\n\n/**\n * Calculates the derivative of a cubic polynomial.\n *\n * @param p - The cubic polynomial to differentiate.\n * @returns The derivative of the cubic polynomial.\n * @since 1.0.0\n */\nexport const derivative: (p: CubicPolynomial) => QuadraticPolynomial = internal.derivative\n\nexport const subdivide: {\n /**\n * Subdivides a cubic polynomial at parameter `t ∈ (0, 1)` into two new\n * cubic polynomials. The first polynomial's evaluation on `[0, 1]` matches\n * the original's on `[0, t]`; the second matches the original's on\n * `[t, 1]`. Equivalent to de Casteljau subdivision in Bernstein form,\n * performed directly in monomial form.\n *\n * @param p - The cubic polynomial to subdivide.\n * @param t - The split parameter; must be in the open interval `(0, 1)`.\n * @returns A `[left, right]` tuple of cubic polynomials.\n * @since 2.0.0\n */\n (p: CubicPolynomial, t: number): [CubicPolynomial, CubicPolynomial]\n /**\n * Subdivides a cubic polynomial at parameter `t ∈ (0, 1)`.\n *\n * @param t - The split parameter; must be in the open interval `(0, 1)`.\n * @returns A function that takes a polynomial and returns its `[left, right]` halves.\n * @since 2.0.0\n */\n (t: number): (p: CubicPolynomial) => [CubicPolynomial, CubicPolynomial]\n} = internal.subdivide\n\n/**\n * Calculates the roots of a cubic polynomial.\n *\n * @param p - The cubic polynomial to find the roots of.\n * @returns The roots of the cubic polynomial.\n * @since 1.0.0\n */\nexport const roots: (p: CubicPolynomial) => Solution.AtMostThree<number> = internal.roots\n\n/**\n * Calculates the extrema of a cubic polynomial.\n *\n * @param p - The cubic polynomial to find the extrema of.\n * @returns The extrema of the cubic polynomial.\n * @since 1.0.0\n */\nexport const extrema: (p: CubicPolynomial) => Solution.AtMostTwo<number> = internal.extrema\n\nexport const monotonicity: {\n /**\n * Calculates the monotonicity of a cubic polynomial. Throws when the\n * interval has zero width — the question is undefined at a single point.\n *\n * @param p - The cubic polynomial to analyze.\n * @param i - The interval to restrict the analysis to.\n * @returns The monotonicity of the cubic polynomial in the specified interval.\n * @since 1.0.0\n */\n (p: CubicPolynomial, i?: Interval): Monotonicity\n /**\n * Calculates the monotonicity of a cubic polynomial. Throws when the\n * interval has zero width.\n *\n * @param i - The interval to restrict the analysis to.\n * @returns A function that takes a cubic polynomial and returns the\n * monotonicity of the cubic polynomial in the specified interval.\n * @since 1.0.0\n */\n (i: Interval): (p: CubicPolynomial) => Monotonicity\n} = internal.monotonicity\n\n/**\n * Type-narrowing predicate: refines a `CubicPolynomial<T>` to\n * `CubicPolynomial<T & Monotonic>` when the polynomial is strictly monotonic\n * over the given interval (or globally, when no interval is given).\n *\n * @param p - The cubic polynomial to check.\n * @param i - Optional interval over which to check monotonicity.\n * @returns `true` when monotonicity is `Increasing` or `Decreasing`.\n * @since 2.0.0\n */\nexport const isMonotonic: {\n <T>(p: CubicPolynomial<T>, i?: Interval): p is CubicPolynomial<T & Monotonic>\n (i: Interval): <T>(p: CubicPolynomial<T>) => p is CubicPolynomial<T & Monotonic>\n} = internal.isMonotonic\n\n/**\n * Type-narrowing predicate: refines to `CubicPolynomial<T & Increasing>`.\n *\n * @since 2.0.0\n */\nexport const isIncreasing: {\n <T>(p: CubicPolynomial<T>, i?: Interval): p is CubicPolynomial<T & Increasing>\n (i: Interval): <T>(p: CubicPolynomial<T>) => p is CubicPolynomial<T & Increasing>\n} = internal.isIncreasing\n\n/**\n * Type-narrowing predicate: refines to `CubicPolynomial<T & Decreasing>`.\n *\n * @since 2.0.0\n */\nexport const isDecreasing: {\n <T>(p: CubicPolynomial<T>, i?: Interval): p is CubicPolynomial<T & Decreasing>\n (i: Interval): <T>(p: CubicPolynomial<T>) => p is CubicPolynomial<T & Decreasing>\n} = internal.isDecreasing\n\n/**\n * Asserts that the cubic polynomial is monotonic, throwing on failure.\n *\n * @param p - The cubic polynomial to assert against.\n * @param i - Optional interval over which to check monotonicity.\n * @returns The same polynomial, typed with the `Monotonic` brand.\n * @throws When the polynomial is not monotonic over the given (or global) interval.\n * @since 2.0.0\n */\nexport const asMonotonic: <T>(\n p: CubicPolynomial<T>,\n i?: Interval,\n) => CubicPolynomial<T & Monotonic> = internal.asMonotonic\n\n/**\n * Asserts that the cubic polynomial is increasing, throwing on failure.\n *\n * @since 2.0.0\n */\nexport const asIncreasing: <T>(\n p: CubicPolynomial<T>,\n i?: Interval,\n) => CubicPolynomial<T & Increasing> = internal.asIncreasing\n\n/**\n * Asserts that the cubic polynomial is decreasing, throwing on failure.\n *\n * @since 2.0.0\n */\nexport const asDecreasing: <T>(\n p: CubicPolynomial<T>,\n i?: Interval,\n) => CubicPolynomial<T & Decreasing> = internal.asDecreasing\n\nexport const domain: {\n /**\n * Calculates the domain of a cubic polynomial.\n *\n * @param p - The cubic polynomial to analyze.\n * @param range - The range to restrict the analysis to.\n * @returns The domain of the cubic polynomial in the specified range.\n * @since 1.0.0\n */\n (p: CubicPolynomial, range: Interval): Interval\n /**\n * Calculates the domain of a cubic polynomial.\n *\n * @param range - The range to restrict the analysis to.\n * @returns A function that takes a cubic polynomial and returns the domain of the cubic polynomial in the specified range.\n * @since 1.0.0\n */\n (range: Interval): (p: CubicPolynomial) => Interval\n} = internal.domain\n\nexport const range: {\n /**\n * Calculates the range of a cubic polynomial.\n *\n * @param p - The cubic polynomial to analyze.\n * @param domain - The domain to restrict the analysis to.\n * @returns The range of the cubic polynomial in the specified domain.\n * @since 1.0.0\n */\n (p: CubicPolynomial, domain: Interval): Closed\n /**\n * Calculates the range of a cubic polynomial.\n *\n * @param domain - The domain to restrict the analysis to.\n * @returns A function that takes a cubic polynomial and returns the range of the cubic polynomial in the specified domain.\n * @since 1.0.0\n */\n (domain: Interval): (p: CubicPolynomial) => Closed\n} = internal.range\n\n/**\n * Calculates the range of a cubic polynomial over the unit interval `[0, 1]`.\n * Equivalent to `range(p, Interval.unit)` — accounts for up to two interior\n * extrema in `[0, 1]`.\n *\n * @param p - The cubic polynomial.\n * @returns The closed range of the polynomial over `[0, 1]`.\n * @since 2.0.0\n */\nexport const unitRange: (p: CubicPolynomial) => Closed = internal.unitRange\n\nexport const length: {\n /**\n * Calculates the length of a cubic polynomial.\n *\n * @param p - The cubic polynomial to analyze.\n * @param domain - The domain to restrict the analysis to.\n * @returns The length of the cubic polynomial in the specified domain.\n * @since 1.0.0\n */\n (p: CubicPolynomial, domain: Interval): number\n /**\n * Calculates the length of a cubic polynomial.\n *\n * @param domain - The domain to restrict the analysis to.\n * @returns A function that takes a cubic polynomial and returns the length of the cubic polynomial in the specified domain.\n * @since 1.0.0\n */\n (domain: Interval): (p: CubicPolynomial) => number\n} = internal.length\n\nexport const curvature: {\n /**\n * Calculates the curvature of a cubic polynomial.\n *\n * @param p - The cubic polynomial to analyze.\n * @param x - The value of x to calculate the curvature at.\n * @returns The curvature of the cubic polynomial at the specified value of x.\n * @since 1.0.0\n */\n (p: CubicPolynomial, x: number): number\n /**\n * Calculates the curvature of a cubic polynomial.\n *\n * @param x - The value of x to calculate the curvature at.\n * @returns A function that takes a cubic polynomial and returns the curvature of the cubic polynomial at the specified value of x.\n * @since 1.0.0\n */\n (x: number): (p: CubicPolynomial) => number\n} = internal.curvature\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"interval-Dm35Xhy4.mjs","names":["isInterval","equals","aligned","make","makeOpenStart","makeOpenEnd","makeOpen","fromSize","fromMinMax","size","contains","containsApprox","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.containsApprox","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.ts'\nimport { dual, Pipeable } from '../utils.ts'\nimport { EPSILON, epsEquals } from '../number.ts'\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\n/** @internal */\nexport const isInterval = (v: unknown): v is Interval =>\n typeof v === 'object' && v !== null && TypeId in v\n\n/** @internal */\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\n/** @internal */\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\n/** @internal */\nexport const make = (start: number, end?: number): Closed => new ClosedImpl(start, end ?? start)\n\n/** @internal */\nexport const makeOpenStart = (start: number, end?: number): OpenStart =>\n new OpenStartImpl(start, end ?? start)\n\n/** @internal */\nexport const makeOpenEnd = (start: number, end?: number): OpenEnd =>\n new OpenEndImpl(start, end ?? start)\n\n/** @internal */\nexport const makeOpen = (start: number, end?: number): Open => new OpenImpl(start, end ?? start)\n\n/** @internal */\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\n/** @internal */\nexport const fromMinMax = (...values: ReadonlyArray<number>): Closed =>\n new ClosedImpl(Math.min(...values), Math.max(...values))\n\n/** @internal */\nexport const size = (i: Bounds): number => Math.abs(i.end - i.start)\n\n/** @internal */\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\n// Approximate containment: value is in the interval *or* within eps of either\n// boundary. Endpoint inclusivity is ignored — at the EPSILON scale the\n// open/closed distinction loses meaning, and the use case is float-tolerant\n// containment checks (e.g. \"is this query in the segment's range?\"). Use\n// `contains` if you need kind-strict semantics.\n/** @internal */\nexport const containsApprox = (interval: Interval, value: number, eps = EPSILON): boolean =>\n value >= interval.start - eps && value <= interval.end + eps\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.\n/** @internal */\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.\n/** @internal */\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\n/** @internal */\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\n/** @internal */\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\n/** @internal */\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\n/** @internal */\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\n/** @internal */\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\n/** @internal */\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\n/** @internal */\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\n/** @internal */\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\n/** @internal */\nexport const isClosed = (i: Interval): i is Closed => i.kind === 'closed'\n/** @internal */\nexport const isOpen = (i: Interval): i is Open => i.kind === 'open'\n/** @internal */\nexport const isOpenStart = (i: Interval): i is OpenStart => i.kind === 'open-start'\n/** @internal */\nexport const isOpenEnd = (i: Interval): i is OpenEnd => i.kind === 'open-end'\n\n/** @internal */\nexport const isOpenAtStart = (i: Interval): i is OpenStart | Open =>\n i.kind === 'open-start' || i.kind === 'open'\n/** @internal */\nexport const isOpenAtEnd = (i: Interval): i is OpenEnd | Open =>\n i.kind === 'open-end' || i.kind === 'open'\n/** @internal */\nexport const isClosedAtStart = (i: Interval): i is Closed | OpenEnd =>\n i.kind === 'closed' || i.kind === 'open-end'\n/** @internal */\nexport const isClosedAtEnd = (i: Interval): i is Closed | OpenStart =>\n i.kind === 'closed' || i.kind === 'open-start'\n\n/** @internal */\nexport const unit: Closed = make(0, 1)\n\n/** @internal */\nexport const unitOpen: Open = new OpenImpl(0, 1)\n\n/** @internal */\nexport const biunit: Closed = make(-1, 1)\n\n/** @internal */\nexport const lerp = (interval: Bounds, t: number): number =>\n (1 - t) * interval.start + t * interval.end\n\n/** @internal */\nexport const toLerpFn =\n (interval: Bounds) =>\n (t: number): number =>\n lerp(interval, t)\n\n/** @internal */\nexport const normalize = (interval: Bounds, x: number): number =>\n (x - interval.start) / size(interval)\n\n/** @internal */\nexport const toNormalizeFn =\n (interval: Bounds) =>\n (x: number): number =>\n normalize(interval, x)\n\n/** @internal */\nexport const remap = (source: Bounds, target: Bounds, x: number): number =>\n target.start + ((x - source.start) * size(target)) / size(source)\n\n/** @internal */\nexport const toRemapFn =\n (source: Bounds, target: Bounds) =>\n (x: number): number =>\n remap(source, target, x)\n\n/** @internal */\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.ts'\nimport type { Pipeable } from '../utils.ts'\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\n/**\n * Float-tolerant containment: returns `true` if `value` is in the interval or\n * within `eps` of either boundary. Endpoint inclusivity is ignored — at the\n * `EPSILON` scale the open/closed distinction loses meaning, and the use case\n * is \"is this query approximately in this range, accounting for float drift?\".\n * Use {@link contains} if you need kind-strict semantics.\n *\n * @param interval - The interval to check against.\n * @param value - The value to check.\n * @param eps - The absolute tolerance. Defaults to {@link EPSILON}.\n * @returns `true` when `interval.start - eps <= value <= interval.end + eps`.\n * @since 2.0.0\n */\nexport const containsApprox: (interval: Interval, value: number, eps?: number) => boolean =\n internal.containsApprox\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.0.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.0.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.0.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.0.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.0.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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"matrix4x4-BWmf4lZM.mjs","names":["equals","make","fromRows","fromColumns","setRow","toRows","setColumn","toColumns","determinant","vectorProductLeft","vector2.make","vector2.dot","rowVector","vectorProductRight","columnVector","solveSystem","transpose","reverseRows","reverseColumns","equals","make","fromRows","fromColumns","setRow","toRows","setColumn","toColumns","determinant","matrix2x2.determinant","minor","vector3.components","matrix2x2.make","vectorProductLeft","vector3.make","vector3.dot","vectorProductRight","solveSystem","rowVector","columnVector","transpose","reverseRows","reverseColumns","isMatrix4x4","equals","identity","make","fromRows","fromColumns","setRow","toRows","setColumn","toColumns","determinant","matrix3x3.determinant","minor","vector4.components","matrix3x3.make","vectorProductLeft","vector4.make","vector4.dot","vectorProductRight","multiply","inverse","solveSystem","rowVector","columnVector","transpose","reverseRows","reverseColumns","internal.isMatrix4x4","internal.identity","internal.equals","internal.make","internal.fromRows","internal.fromColumns","internal.setRow","internal.setColumn","internal.determinant","internal.minor","internal.vectorProductLeft","internal.vectorProductRight","internal.multiply","internal.inverse","internal.solveSystem","internal.toRows","internal.toColumns","internal.rowVector","internal.columnVector","internal.transpose","internal.reverseRows","internal.reverseColumns"],"sources":["../../src/dimensions.ts","../../src/matrix/matrix2x2.internal.ts","../../src/matrix/matrix3x3.internal.ts","../../src/matrix/matrix4x4.internal.ts","../../src/matrix/matrix4x4.ts"],"sourcesContent":["import { invariant } from './utils.ts'\n\nexport type TwoDimensionalIndex = 0 | 1\nexport type TwoDimensionalComponent = 'x' | 'y'\n\nexport interface TwoDimensional<out T1, out T2 = T1> {\n readonly x: T1\n readonly y: T2\n\n readonly 0: T1\n readonly 1: T2\n}\n\nexport type ThreeDimensionalIndex = TwoDimensionalIndex | 2\nexport type ThreeDimensionalComponent = TwoDimensionalComponent | 'z'\n\nexport interface ThreeDimensional<out T1, out T2 = T1, out T3 = T2> extends TwoDimensional<T1, T2> {\n readonly z: T3\n readonly 2: T3\n}\n\nexport type FourDimensionalIndex = ThreeDimensionalIndex | 3\nexport type FourDimensionalComponent = ThreeDimensionalComponent | 'w'\n\nexport interface FourDimensional<\n out T1,\n out T2 = T1,\n out T3 = T2,\n out T4 = T3,\n> extends ThreeDimensional<T1, T2, T3> {\n readonly w: T4\n readonly 3: T4\n}\n\nfunction toIndex(input: string | number): number {\n if (typeof input === 'number') {\n invariant(input >= 0 && input <= 3, 'Index out of bounds')\n\n return input\n }\n\n if (input === 'x') {\n return 0\n }\n\n if (input === 'y') {\n return 1\n }\n\n if (input === 'z') {\n return 2\n }\n\n if (input === 'w') {\n return 3\n }\n\n invariant(false, 'Invalid component')\n}\n\nexport const toTwoDimensionalIndex = toIndex as (\n input: TwoDimensionalIndex | TwoDimensionalComponent,\n) => TwoDimensionalIndex\nexport const toThreeDimensionalIndex = toIndex as (\n input: ThreeDimensionalIndex | ThreeDimensionalComponent,\n) => ThreeDimensionalIndex\nexport const toFourDimensionalIndex = toIndex as (\n input: FourDimensionalIndex | FourDimensionalComponent,\n) => FourDimensionalIndex\n","import { toTwoDimensionalIndex } from '../dimensions.ts'\nimport { dual, Pipeable } from '../utils.ts'\nimport { invariant } from '../utils.ts'\nimport { epsEquals } from '../number.ts'\nimport type { Vector2 } from '../vector/vector2.ts'\nimport * as vector2 from '../vector/vector2.internal.ts'\nimport type { Matrix2x2, Matrix2x2Coordinate } from './matrix2x2.ts'\n\nexport const Matrix2x2TypeId: unique symbol = Symbol.for('curvy/matrix2x2')\nexport type Matrix2x2TypeId = typeof Matrix2x2TypeId\n\nclass Matrix2x2Impl extends Pipeable implements Matrix2x2 {\n readonly [Matrix2x2TypeId]: Matrix2x2TypeId = Matrix2x2TypeId\n\n readonly m00: number\n readonly m01: number\n\n readonly m10: number\n readonly m11: number\n\n constructor(m00 = 0, m01 = 0, m10 = 0, m11 = 0) {\n super()\n this.m00 = m00\n this.m01 = m01\n this.m10 = m10\n this.m11 = m11\n }\n\n get [Symbol.toStringTag]() {\n return `Matrix2x2(${this.m00}, ${this.m01}, ${this.m10}, ${this.m11})`\n }\n\n get [Symbol.for('nodejs.util.inspect.custom')]() {\n return `Matrix2x2(${this.m00}, ${this.m01}, ${this.m10}, ${this.m11})`\n }\n\n [Symbol.hasInstance](m: unknown): m is Matrix2x2 {\n return isMatrix2x2(m)\n }\n}\n\n/** @internal */\nexport const isMatrix2x2 = (m: unknown): m is Matrix2x2 =>\n typeof m === 'object' && m !== null && Matrix2x2TypeId in m\n\n/** @internal */\nexport const equals = dual<\n (b: Matrix2x2) => (a: Matrix2x2) => boolean,\n (a: Matrix2x2, b: Matrix2x2) => boolean\n>(\n 2,\n (a: Matrix2x2, b: Matrix2x2) =>\n epsEquals(a.m00, b.m00) &&\n epsEquals(a.m01, b.m01) &&\n epsEquals(a.m10, b.m10) &&\n epsEquals(a.m11, b.m11),\n)\n\n/** @internal */\nexport const make = (m00 = 0, m01 = m00, m10 = m01, m11 = m10) =>\n new Matrix2x2Impl(m00, m01, m10, m11)\n\n/** @internal */\nexport const fromRows = (v0: Vector2, v1: Vector2) => new Matrix2x2Impl(v0.x, v0.y, v1.x, v1.y)\n\n/** @internal */\nexport const fromColumns = (v0: Vector2, v1: Vector2) => new Matrix2x2Impl(v0.x, v1.x, v0.y, v1.y)\n\n/** @internal */\nexport const setRow = dual<\n (row: Matrix2x2Coordinate, v: Vector2) => (m: Matrix2x2) => Matrix2x2,\n (m: Matrix2x2, row: Matrix2x2Coordinate, v: Vector2) => Matrix2x2\n>(3, (m: Matrix2x2, row: Matrix2x2Coordinate, v: Vector2) =>\n fromRows(...(toRows(m).with(toTwoDimensionalIndex(row), v) as [Vector2, Vector2])),\n)\n\n/** @internal */\nexport const setColumn = dual<\n (column: Matrix2x2Coordinate, v: Vector2) => (m: Matrix2x2) => Matrix2x2,\n (m: Matrix2x2, column: Matrix2x2Coordinate, v: Vector2) => Matrix2x2\n>(3, (m: Matrix2x2, column: Matrix2x2Coordinate, v: Vector2) =>\n fromColumns(...(toColumns(m).with(toTwoDimensionalIndex(column), v) as [Vector2, Vector2])),\n)\n\n/** @internal */\nexport const determinant = (m: Matrix2x2): number => m.m00 * m.m11 - m.m01 * m.m10\n\n// (a: Vector2, b: Vector2) => a.x * b.x + a.y * b.y\n\n/*\n * {\n * x: first row dot v -> fr.x\n * y: second row dot v\n * }\n * */\n\n/** @internal */\nexport const vectorProductLeft = dual<\n (v: Vector2) => (m: Matrix2x2) => Vector2,\n (m: Matrix2x2, v: Vector2) => Vector2\n>(2, (m: Matrix2x2, v: Vector2) =>\n vector2.make(vector2.dot(rowVector(m, 0), v), vector2.dot(rowVector(m, 1), v)),\n)\n\n/** @internal */\nexport const vectorProductRight = dual<\n (v: Vector2) => (m: Matrix2x2) => Vector2,\n (m: Matrix2x2, v: Vector2) => Vector2\n>(2, (m: Matrix2x2, v: Vector2) =>\n vector2.make(vector2.dot(columnVector(m, 0), v), vector2.dot(columnVector(m, 1), v)),\n)\n\n/** @internal */\nexport const solveSystem = dual<\n (v: Vector2) => (m: Matrix2x2) => Vector2,\n (m: Matrix2x2, v: Vector2) => Vector2\n>(2, (m: Matrix2x2, v: Vector2) => {\n const inverseDeterminant = 1 / determinant(m)\n\n invariant(\n Number.isFinite(inverseDeterminant),\n 'cannot solve system when coefficient matrix determinant is zero',\n )\n\n return vector2.make(\n determinant(setColumn(m, 0, v)) * inverseDeterminant,\n determinant(setColumn(m, 1, v)) * inverseDeterminant,\n )\n})\n\n/** @internal */\nexport const toRows = (m: Matrix2x2): [Vector2, Vector2] => [\n vector2.make(m.m00, m.m01),\n vector2.make(m.m10, m.m11),\n]\n\n/** @internal */\nexport const toColumns = (m: Matrix2x2): [Vector2, Vector2] => [\n vector2.make(m.m00, m.m10),\n vector2.make(m.m01, m.m11),\n]\n\n/** @internal */\nexport const rowVector = dual<\n (row: Matrix2x2Coordinate) => (m: Matrix2x2) => Vector2,\n (m: Matrix2x2, row: Matrix2x2Coordinate) => Vector2\n>(2, (m: Matrix2x2, row: Matrix2x2Coordinate) => toRows(m)[toTwoDimensionalIndex(row)])\n\n/** @internal */\nexport const columnVector = dual<\n (column: Matrix2x2Coordinate) => (m: Matrix2x2) => Vector2,\n (m: Matrix2x2, column: Matrix2x2Coordinate) => Vector2\n>(2, (m: Matrix2x2, column: Matrix2x2Coordinate) => toColumns(m)[toTwoDimensionalIndex(column)])\n\n/** @internal */\nexport const transpose = (m: Matrix2x2) => fromColumns(...toRows(m))\n\n/** @internal */\nexport const reverseRows = (m: Matrix2x2) => {\n const [r0, r1] = toRows(m)\n return fromRows(r1, r0)\n}\n\n/** @internal */\nexport const reverseColumns = (m: Matrix2x2) => {\n const [c0, c1] = toColumns(m)\n return fromColumns(c1, c0)\n}\n","import { toThreeDimensionalIndex } from '../dimensions.ts'\nimport { dual, Pipeable } from '../utils.ts'\nimport { invariant } from '../utils.ts'\nimport { epsEquals } from '../number.ts'\nimport type { Vector3 } from '../vector/vector3.ts'\nimport * as vector3 from '../vector/vector3.internal.ts'\nimport type { Matrix2x2 } from './matrix2x2.ts'\nimport * as matrix2x2 from './matrix2x2.internal.ts'\nimport type { Matrix3x3, Matrix3x3Coordinate } from './matrix3x3.ts'\n\nexport const Matrix3x3TypeId: unique symbol = Symbol.for('curvy/matrix3x3')\nexport type Matrix3x3TypeId = typeof Matrix3x3TypeId\n\nclass Matrix3x3Impl extends Pipeable implements Matrix3x3 {\n readonly [Matrix3x3TypeId]: Matrix3x3TypeId = Matrix3x3TypeId\n\n readonly m00: number\n readonly m01: number\n readonly m02: number\n\n readonly m10: number\n readonly m11: number\n readonly m12: number\n\n readonly m20: number\n readonly m21: number\n readonly m22: number\n\n constructor(m00 = 0, m01 = 0, m02 = 0, m10 = 0, m11 = 0, m12 = 0, m20 = 0, m21 = 0, m22 = 0) {\n super()\n this.m00 = m00\n this.m01 = m01\n this.m02 = m02\n this.m10 = m10\n this.m11 = m11\n this.m12 = m12\n this.m20 = m20\n this.m21 = m21\n this.m22 = m22\n }\n\n get [Symbol.toStringTag]() {\n return `Matrix3x3(${this.m00}, ${this.m01}, ${this.m02}, ${this.m10}, ${this.m11}, ${this.m12}, ${this.m20}, ${this.m21}, ${this.m22})`\n }\n\n get [Symbol.for('nodejs.util.inspect.custom')]() {\n return `Matrix3x3(${this.m00}, ${this.m01}, ${this.m02}, ${this.m10}, ${this.m11}, ${this.m12}, ${this.m20}, ${this.m21}, ${this.m22})`\n }\n\n [Symbol.hasInstance](m: unknown): m is Matrix3x3 {\n return isMatrix3x3(m)\n }\n}\n\nexport type { Matrix3x3 }\n\n/** @internal */\nexport const isMatrix3x3 = (m: unknown): m is Matrix3x3 =>\n typeof m === 'object' && m !== null && Matrix3x3TypeId in m\n\n/** @internal */\nexport const equals = dual<\n (b: Matrix3x3) => (a: Matrix3x3) => boolean,\n (a: Matrix3x3, b: Matrix3x3) => boolean\n>(\n 2,\n (a: Matrix3x3, b: Matrix3x3) =>\n epsEquals(a.m00, b.m00) &&\n epsEquals(a.m01, b.m01) &&\n epsEquals(a.m02, b.m02) &&\n epsEquals(a.m10, b.m10) &&\n epsEquals(a.m11, b.m11) &&\n epsEquals(a.m12, b.m12) &&\n epsEquals(a.m20, b.m20) &&\n epsEquals(a.m21, b.m21) &&\n epsEquals(a.m22, b.m22),\n)\n\n/** @internal */\nexport const make = (\n m00 = 0,\n m01 = m00,\n m02 = m01,\n m10 = m02,\n m11 = m10,\n m12 = m11,\n m20 = m12,\n m21 = m20,\n m22 = m21,\n): Matrix3x3 => {\n return new Matrix3x3Impl(m00, m01, m02, m10, m11, m12, m20, m21, m22)\n}\n\n/** @internal */\nexport const fromRows = (v0: Vector3, v1: Vector3, v2: Vector3): Matrix3x3 =>\n new Matrix3x3Impl(v0.x, v0.y, v0.z, v1.x, v1.y, v1.z, v2.x, v2.y, v2.z)\n\n/** @internal */\nexport const fromColumns = (v0: Vector3, v1: Vector3, v2: Vector3): Matrix3x3 =>\n new Matrix3x3Impl(v0.x, v1.x, v2.x, v0.y, v1.y, v2.y, v0.z, v1.z, v2.z)\n\n/** @internal */\nexport const setRow = dual<\n (row: Matrix3x3Coordinate, v: Vector3) => (m: Matrix3x3) => Matrix3x3,\n (m: Matrix3x3, row: Matrix3x3Coordinate, v: Vector3) => Matrix3x3\n>(3, (m: Matrix3x3, row: Matrix3x3Coordinate, v: Vector3) =>\n fromRows(...(toRows(m).with(toThreeDimensionalIndex(row), v) as [Vector3, Vector3, Vector3])),\n)\n\n/** @internal */\nexport const setColumn = dual<\n (column: Matrix3x3Coordinate, v: Vector3) => (m: Matrix3x3) => Matrix3x3,\n (m: Matrix3x3, column: Matrix3x3Coordinate, v: Vector3) => Matrix3x3\n>(3, (m: Matrix3x3, column: Matrix3x3Coordinate, v: Vector3) =>\n fromColumns(\n ...(toColumns(m).with(toThreeDimensionalIndex(column), v) as [Vector3, Vector3, Vector3]),\n ),\n)\n\n/** @internal */\nexport const determinant = (m: Matrix3x3) =>\n m.m00 * matrix2x2.determinant(minor(m, 0, 0)) -\n m.m01 * matrix2x2.determinant(minor(m, 0, 1)) +\n m.m02 * matrix2x2.determinant(minor(m, 0, 2))\n\n/** @internal */\nexport const minor = dual<\n (row: Matrix3x3Coordinate, column: Matrix3x3Coordinate) => (m: Matrix3x3) => Matrix2x2,\n (m: Matrix3x3, row: Matrix3x3Coordinate, column: Matrix3x3Coordinate) => Matrix2x2\n>(3, (m: Matrix3x3, row: Matrix3x3Coordinate, column: Matrix3x3Coordinate) => {\n const [v0, v1] = toRows(m).toSpliced(toThreeDimensionalIndex(row), 1) as [Vector3, Vector3]\n const columnIndex = toThreeDimensionalIndex(column)\n const [m00, m01] = vector3.components(v0).toSpliced(columnIndex, 1) as [number, number]\n const [m10, m11] = vector3.components(v1).toSpliced(columnIndex, 1) as [number, number]\n\n return matrix2x2.make(m00, m01, m10, m11) as Matrix2x2\n})\n\n/** @internal */\nexport const vectorProductLeft = dual<\n (v: Vector3) => (m: Matrix3x3) => Vector3,\n (m: Matrix3x3, v: Vector3) => Vector3\n>(2, (m: Matrix3x3, v: Vector3) => {\n const [v0, v1, v2] = toRows(m) as [Vector3, Vector3, Vector3]\n return vector3.make(vector3.dot(v0, v), vector3.dot(v1, v), vector3.dot(v2, v))\n})\n\n/** @internal */\nexport const vectorProductRight = dual<\n (v: Vector3) => (m: Matrix3x3) => Vector3,\n (m: Matrix3x3, v: Vector3) => Vector3\n>(2, (m: Matrix3x3, v: Vector3) => {\n const [v0, v1, v2] = toColumns(m) as [Vector3, Vector3, Vector3]\n return vector3.make(vector3.dot(v, v0), vector3.dot(v, v1), vector3.dot(v, v2))\n})\n\n/** @internal */\nexport const solveSystem = dual<\n (v: Vector3) => (m: Matrix3x3) => Vector3,\n (m: Matrix3x3, v: Vector3) => Vector3\n>(2, (m: Matrix3x3, v: Vector3) => {\n const inverseDeterminant = 1 / determinant(m)\n\n invariant(\n Number.isFinite(inverseDeterminant),\n 'cannot solve system when coefficient matrix determinant is zero',\n )\n\n return vector3.make(\n determinant(setColumn(m, 0, v)) * inverseDeterminant,\n determinant(setColumn(m, 1, v)) * inverseDeterminant,\n determinant(setColumn(m, 2, v)) * inverseDeterminant,\n )\n})\n\n/** @internal */\nexport const toRows = (m: Matrix3x3): [Vector3, Vector3, Vector3] => [\n vector3.make(m.m00, m.m01, m.m02),\n vector3.make(m.m10, m.m11, m.m12),\n vector3.make(m.m20, m.m21, m.m22),\n]\n\n/** @internal */\nexport const toColumns = (m: Matrix3x3): [Vector3, Vector3, Vector3] => [\n vector3.make(m.m00, m.m10, m.m20),\n vector3.make(m.m01, m.m11, m.m21),\n vector3.make(m.m02, m.m12, m.m22),\n]\n\n/** @internal */\nexport const rowVector = dual<\n (row: Matrix3x3Coordinate) => (m: Matrix3x3) => Vector3,\n (m: Matrix3x3, row: Matrix3x3Coordinate) => Vector3\n>(2, (m: Matrix3x3, row: Matrix3x3Coordinate) => toRows(m)[toThreeDimensionalIndex(row)])\n\n/** @internal */\nexport const columnVector = dual<\n (column: Matrix3x3Coordinate) => (m: Matrix3x3) => Vector3,\n (m: Matrix3x3, column: Matrix3x3Coordinate) => Vector3\n>(2, (m: Matrix3x3, column: Matrix3x3Coordinate) => toColumns(m)[toThreeDimensionalIndex(column)])\n\n/** @internal */\nexport const transpose = (m: Matrix3x3) => fromColumns(...toRows(m))\n\n/** @internal */\nexport const reverseRows = (m: Matrix3x3) => {\n const [v0, v1, v2] = toRows(m)\n return fromRows(v2, v1, v0)\n}\n\n/** @internal */\nexport const reverseColumns = (m: Matrix3x3) => {\n const [v0, v1, v2] = toColumns(m)\n return fromColumns(v2, v1, v0)\n}\n","import { toFourDimensionalIndex } from '../dimensions.ts'\nimport { dual, Pipeable } from '../utils.ts'\nimport { invariant } from '../utils.ts'\nimport { epsEquals } from '../number.ts'\nimport type { Vector4 } from '../vector/vector4.ts'\nimport * as vector4 from '../vector/vector4.internal.ts'\nimport type { Matrix3x3 } from './matrix3x3.ts'\nimport * as matrix3x3 from './matrix3x3.internal.ts'\nimport type { Matrix4x4, Matrix4x4Coordinate } from './matrix4x4.ts'\n\nexport const Matrix4x4TypeId: unique symbol = Symbol.for('curvy/matrix4x4')\nexport type Matrix4x4TypeId = typeof Matrix4x4TypeId\n\nclass Matrix4x4Impl extends Pipeable implements Matrix4x4 {\n readonly [Matrix4x4TypeId]: Matrix4x4TypeId = Matrix4x4TypeId\n\n readonly m00: number\n readonly m01: number\n readonly m02: number\n readonly m03: number\n\n readonly m10: number\n readonly m11: number\n readonly m12: number\n readonly m13: number\n\n readonly m20: number\n readonly m21: number\n readonly m22: number\n readonly m23: number\n\n readonly m30: number\n readonly m31: number\n readonly m32: number\n readonly m33: number\n\n constructor(\n m00 = 0,\n m01 = m00,\n m02 = m01,\n m03 = m02,\n m10 = m00,\n m11 = m01,\n m12 = m02,\n m13 = m03,\n m20 = m00,\n m21 = m01,\n m22 = m02,\n m23 = m03,\n m30 = m00,\n m31 = m01,\n m32 = m02,\n m33 = m03,\n ) {\n super()\n\n this.m00 = m00\n this.m01 = m01\n this.m02 = m02\n this.m03 = m03\n this.m10 = m10\n this.m11 = m11\n this.m12 = m12\n this.m13 = m13\n this.m20 = m20\n this.m21 = m21\n this.m22 = m22\n this.m23 = m23\n this.m30 = m30\n this.m31 = m31\n this.m32 = m32\n this.m33 = m33\n }\n\n get [Symbol.toStringTag]() {\n return `Matrix4x4(${this.m00}, ${this.m01}, ${this.m02}, ${this.m03}, ${this.m10}, ${this.m11}, ${this.m12}, ${this.m13}, ${this.m20}, ${this.m21}, ${this.m22}, ${this.m23}, ${this.m30}, ${this.m31}, ${this.m32}, ${this.m33})`\n }\n\n get [Symbol.for('nodejs.util.inspect.custom')]() {\n return `Matrix4x4(${this.m00}, ${this.m01}, ${this.m02}, ${this.m03}, ${this.m10}, ${this.m11}, ${this.m12}, ${this.m13}, ${this.m20}, ${this.m21}, ${this.m22}, ${this.m23}, ${this.m30}, ${this.m31}, ${this.m32}, ${this.m33})`\n }\n\n [Symbol.hasInstance](m: unknown): m is Matrix4x4 {\n return isMatrix4x4(m)\n }\n}\n\n/** @internal */\nexport const isMatrix4x4 = (m: unknown): m is Matrix4x4 =>\n typeof m === 'object' && m !== null && Matrix4x4TypeId in m\n\n/** @internal */\nexport const equals = dual<\n (b: Matrix4x4) => (a: Matrix4x4) => boolean,\n (a: Matrix4x4, b: Matrix4x4) => boolean\n>(\n 2,\n (a: Matrix4x4, b: Matrix4x4) =>\n epsEquals(a.m00, b.m00) &&\n epsEquals(a.m01, b.m01) &&\n epsEquals(a.m02, b.m02) &&\n epsEquals(a.m03, b.m03) &&\n epsEquals(a.m10, b.m10) &&\n epsEquals(a.m11, b.m11) &&\n epsEquals(a.m12, b.m12) &&\n epsEquals(a.m13, b.m13) &&\n epsEquals(a.m20, b.m20) &&\n epsEquals(a.m21, b.m21) &&\n epsEquals(a.m22, b.m22) &&\n epsEquals(a.m23, b.m23) &&\n epsEquals(a.m30, b.m30) &&\n epsEquals(a.m31, b.m31) &&\n epsEquals(a.m32, b.m32) &&\n epsEquals(a.m33, b.m33),\n)\n\n/**\n * The 4x4 identity matrix.\n * @internal\n */\nexport const identity: Matrix4x4 = new Matrix4x4Impl(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)\n\n// first four arguments are the top row\n/** @internal */\nexport const make = (\n m00 = 0,\n m01 = m00,\n m02 = m01,\n m03 = m02,\n m10 = m00,\n m11 = m01,\n m12 = m02,\n m13 = m03,\n m20 = m00,\n m21 = m01,\n m22 = m02,\n m23 = m03,\n m30 = m00,\n m31 = m01,\n m32 = m02,\n m33 = m03,\n) =>\n new Matrix4x4Impl(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33)\n\n/** @internal */\nexport const fromRows = (v0: Vector4, v1: Vector4, v2: Vector4, v3: Vector4) =>\n new Matrix4x4Impl(\n v0.x,\n v0.y,\n v0.z,\n v0.w,\n v1.x,\n v1.y,\n v1.z,\n v1.w,\n v2.x,\n v2.y,\n v2.z,\n v2.w,\n v3.x,\n v3.y,\n v3.z,\n v3.w,\n )\n\n/** @internal */\nexport const fromColumns = (v0: Vector4, v1: Vector4, v2: Vector4, v3: Vector4) =>\n new Matrix4x4Impl(\n v0.x,\n v1.x,\n v2.x,\n v3.x,\n v0.y,\n v1.y,\n v2.y,\n v3.y,\n v0.z,\n v1.z,\n v2.z,\n v3.z,\n v0.w,\n v1.w,\n v2.w,\n v3.w,\n )\n\n/** @internal */\nexport const setRow = dual<\n (row: Matrix4x4Coordinate, v: Vector4) => (m: Matrix4x4) => Matrix4x4,\n (m: Matrix4x4, row: Matrix4x4Coordinate, v: Vector4) => Matrix4x4\n>(3, (m: Matrix4x4, row: Matrix4x4Coordinate, v: Vector4) =>\n fromRows(\n ...(toRows(m).with(toFourDimensionalIndex(row), v) as [Vector4, Vector4, Vector4, Vector4]),\n ),\n)\n\n/** @internal */\nexport const setColumn = dual<\n (column: Matrix4x4Coordinate, v: Vector4) => (m: Matrix4x4) => Matrix4x4,\n (m: Matrix4x4, column: Matrix4x4Coordinate, v: Vector4) => Matrix4x4\n>(3, (m: Matrix4x4, column: Matrix4x4Coordinate, v: Vector4) =>\n fromColumns(\n ...(toColumns(m).with(toFourDimensionalIndex(column), v) as [\n Vector4,\n Vector4,\n Vector4,\n Vector4,\n ]),\n ),\n)\n\n/** @internal */\nexport const determinant = (m: Matrix4x4) =>\n m.m00 * matrix3x3.determinant(minor(m, 0, 0)) -\n m.m01 * matrix3x3.determinant(minor(m, 0, 1)) +\n m.m02 * matrix3x3.determinant(minor(m, 0, 2)) -\n m.m03 * matrix3x3.determinant(minor(m, 0, 3))\n\n/** @internal */\nexport const minor = dual<\n (row: Matrix4x4Coordinate, column: Matrix4x4Coordinate) => (m: Matrix4x4) => Matrix3x3,\n (m: Matrix4x4, row: Matrix4x4Coordinate, column: Matrix4x4Coordinate) => Matrix3x3\n>(3, (m: Matrix4x4, row: Matrix4x4Coordinate, column: Matrix4x4Coordinate) => {\n const [v0, v1, v2] = toRows(m).toSpliced(toFourDimensionalIndex(row), 1) as [\n Vector4,\n Vector4,\n Vector4,\n ]\n const columnIndex = toFourDimensionalIndex(column)\n const [m00, m01, m02] = vector4.components(v0).toSpliced(columnIndex, 1) as [\n number,\n number,\n number,\n ]\n const [m10, m11, m12] = vector4.components(v1).toSpliced(columnIndex, 1) as [\n number,\n number,\n number,\n ]\n const [m20, m21, m22] = vector4.components(v2).toSpliced(columnIndex, 1) as [\n number,\n number,\n number,\n ]\n\n return matrix3x3.make(m00, m01, m02, m10, m11, m12, m20, m21, m22)\n})\n\n/** @internal */\nexport const vectorProductLeft = dual<\n (v: Vector4) => (m: Matrix4x4) => Vector4,\n (m: Matrix4x4, v: Vector4) => Vector4\n>(2, (m: Matrix4x4, v: Vector4) => {\n const [v0, v1, v2, v3] = toRows(m) as [Vector4, Vector4, Vector4, Vector4]\n return vector4.make(\n vector4.dot(v0, v),\n vector4.dot(v1, v),\n vector4.dot(v2, v),\n vector4.dot(v3, v),\n )\n})\n\n/** @internal */\nexport const vectorProductRight = dual<\n (v: Vector4) => (m: Matrix4x4) => Vector4,\n (m: Matrix4x4, v: Vector4) => Vector4\n>(2, (m: Matrix4x4, v: Vector4) => {\n const [v0, v1, v2, v3] = toColumns(m) as [Vector4, Vector4, Vector4, Vector4]\n\n return vector4.make(\n vector4.dot(v, v0),\n vector4.dot(v, v1),\n vector4.dot(v, v2),\n vector4.dot(v, v3),\n )\n})\n\n/** @internal */\nexport const multiply = dual<\n (b: Matrix4x4) => (a: Matrix4x4) => Matrix4x4,\n (a: Matrix4x4, b: Matrix4x4) => Matrix4x4\n>(\n 2,\n (a: Matrix4x4, b: Matrix4x4) =>\n new Matrix4x4Impl(\n a.m00 * b.m00 + a.m01 * b.m10 + a.m02 * b.m20 + a.m03 * b.m30,\n a.m00 * b.m01 + a.m01 * b.m11 + a.m02 * b.m21 + a.m03 * b.m31,\n a.m00 * b.m02 + a.m01 * b.m12 + a.m02 * b.m22 + a.m03 * b.m32,\n a.m00 * b.m03 + a.m01 * b.m13 + a.m02 * b.m23 + a.m03 * b.m33,\n a.m10 * b.m00 + a.m11 * b.m10 + a.m12 * b.m20 + a.m13 * b.m30,\n a.m10 * b.m01 + a.m11 * b.m11 + a.m12 * b.m21 + a.m13 * b.m31,\n a.m10 * b.m02 + a.m11 * b.m12 + a.m12 * b.m22 + a.m13 * b.m32,\n a.m10 * b.m03 + a.m11 * b.m13 + a.m12 * b.m23 + a.m13 * b.m33,\n a.m20 * b.m00 + a.m21 * b.m10 + a.m22 * b.m20 + a.m23 * b.m30,\n a.m20 * b.m01 + a.m21 * b.m11 + a.m22 * b.m21 + a.m23 * b.m31,\n a.m20 * b.m02 + a.m21 * b.m12 + a.m22 * b.m22 + a.m23 * b.m32,\n a.m20 * b.m03 + a.m21 * b.m13 + a.m22 * b.m23 + a.m23 * b.m33,\n a.m30 * b.m00 + a.m31 * b.m10 + a.m32 * b.m20 + a.m33 * b.m30,\n a.m30 * b.m01 + a.m31 * b.m11 + a.m32 * b.m21 + a.m33 * b.m31,\n a.m30 * b.m02 + a.m31 * b.m12 + a.m32 * b.m22 + a.m33 * b.m32,\n a.m30 * b.m03 + a.m31 * b.m13 + a.m32 * b.m23 + a.m33 * b.m33,\n ),\n)\n\n/** @internal */\nexport const inverse = (m: Matrix4x4): Matrix4x4 => {\n const det = determinant(m)\n invariant(det !== 0, 'cannot invert singular matrix')\n\n const inv = 1 / det\n // adjugate is the transpose of the cofactor matrix\n const cof = (row: Matrix4x4Coordinate, col: Matrix4x4Coordinate) => {\n const sign = ((row as number) + (col as number)) % 2 === 0 ? 1 : -1\n return sign * matrix3x3.determinant(minor(m, row, col)) * inv\n }\n\n return new Matrix4x4Impl(\n cof(0, 0),\n cof(1, 0),\n cof(2, 0),\n cof(3, 0),\n cof(0, 1),\n cof(1, 1),\n cof(2, 1),\n cof(3, 1),\n cof(0, 2),\n cof(1, 2),\n cof(2, 2),\n cof(3, 2),\n cof(0, 3),\n cof(1, 3),\n cof(2, 3),\n cof(3, 3),\n )\n}\n\n/** @internal */\nexport const solveSystem = dual<\n (v: Vector4) => (m: Matrix4x4) => Vector4,\n (m: Matrix4x4, v: Vector4) => Vector4\n>(2, (m: Matrix4x4, v: Vector4) => {\n const inverseDeterminant = 1 / determinant(m)\n\n invariant(\n Number.isFinite(inverseDeterminant),\n 'cannot solve system when coefficient matrix determinant is zero',\n )\n\n return vector4.make(\n determinant(setColumn(m, 0, v)) * inverseDeterminant,\n determinant(setColumn(m, 1, v)) * inverseDeterminant,\n determinant(setColumn(m, 2, v)) * inverseDeterminant,\n determinant(setColumn(m, 3, v)) * inverseDeterminant,\n )\n})\n\n/** @internal */\nexport const toRows = (m: Matrix4x4) =>\n [\n vector4.make(m.m00, m.m01, m.m02, m.m03),\n vector4.make(m.m10, m.m11, m.m12, m.m13),\n vector4.make(m.m20, m.m21, m.m22, m.m23),\n vector4.make(m.m30, m.m31, m.m32, m.m33),\n ] as const\n\n/** @internal */\nexport const toColumns = (m: Matrix4x4) =>\n [\n vector4.make(m.m00, m.m10, m.m20, m.m30),\n vector4.make(m.m01, m.m11, m.m21, m.m31),\n vector4.make(m.m02, m.m12, m.m22, m.m32),\n vector4.make(m.m03, m.m13, m.m23, m.m33),\n ] as const\n\n/** @internal */\nexport const rowVector = dual<\n (row: Matrix4x4Coordinate) => (m: Matrix4x4) => Vector4,\n (m: Matrix4x4, row: Matrix4x4Coordinate) => Vector4\n>(2, (m: Matrix4x4, row: Matrix4x4Coordinate) => toRows(m)[toFourDimensionalIndex(row)])\n\n/** @internal */\nexport const columnVector = dual<\n (column: Matrix4x4Coordinate) => (m: Matrix4x4) => Vector4,\n (m: Matrix4x4, column: Matrix4x4Coordinate) => Vector4\n>(2, (m: Matrix4x4, column: Matrix4x4Coordinate) => toColumns(m)[toFourDimensionalIndex(column)])\n\n/** @internal */\nexport const transpose = (m: Matrix4x4) => fromColumns(...toRows(m)) as Matrix4x4\n\n/** @internal */\nexport const reverseRows = (m: Matrix4x4) => {\n const [v0, v1, v2, v3] = toRows(m) as [Vector4, Vector4, Vector4, Vector4]\n return fromRows(v3, v2, v1, v0)\n}\n\n/** @internal */\nexport const reverseColumns = (m: Matrix4x4) => {\n const [v0, v1, v2, v3] = toColumns(m) as [Vector4, Vector4, Vector4, Vector4]\n return fromColumns(v3, v2, v1, v0)\n}\n","import type { FourDimensionalComponent, FourDimensionalIndex } from '../dimensions.ts'\nimport type { Pipeable } from '../utils.ts'\nimport type { Vector4 } from '../vector/vector4.ts'\nimport type { Matrix3x3 } from './matrix3x3.ts'\nimport type { Matrix4x4TypeId } from './matrix4x4.internal.ts'\nimport * as internal from './matrix4x4.internal.ts'\n\n/**\n * A coordinate in a 4x4 matrix.\n *\n * @since 1.0.0\n */\nexport type Matrix4x4Coordinate = FourDimensionalIndex | FourDimensionalComponent\n\n/**\n * A 4x4 matrix.\n *\n * All fields are readonly and immutable, and all operations create new instances.\n *\n * @since 1.0.0\n */\nexport interface Matrix4x4 extends Pipeable {\n readonly [Matrix4x4TypeId]: Matrix4x4TypeId\n\n /**\n * The value of the first row and first column.\n */\n readonly m00: number\n /**\n * The value of the first row and second column.\n */\n readonly m01: number\n /**\n * The value of the first row and third column.\n */\n readonly m02: number\n /**\n * The value of the first row and fourth column.\n */\n readonly m03: number\n /**\n * The value of the second row and first column.\n */\n readonly m10: number\n /**\n * The value of the second row and second column.\n */\n readonly m11: number\n /**\n * The value of the second row and third column.\n */\n readonly m12: number\n /**\n * The value of the second row and fourth column.\n */\n readonly m13: number\n /**\n * The value of the third row and first column.\n */\n readonly m20: number\n /**\n * The value of the third row and second column.\n */\n readonly m21: number\n /**\n * The value of the third row and third column.\n */\n readonly m22: number\n /**\n * The value of the third row and fourth column.\n */\n readonly m23: number\n /**\n * The value of the fourth row and first column.\n */\n readonly m30: number\n /**\n * The value of the fourth row and second column.\n */\n readonly m31: number\n /**\n * The value of the fourth row and third column.\n */\n readonly m32: number\n /**\n * The value of the fourth row and fourth column.\n */\n readonly m33: number\n}\n\n/**\n * Checks if a value is a `Matrix4x4`.\n *\n * @param m - The value to check.\n * @returns `true` if the value is a `Matrix4x4`, `false` otherwise.\n * @since 1.0.0\n */\nexport const isMatrix4x4: (m: unknown) => m is Matrix4x4 = internal.isMatrix4x4\n\n/**\n * The 4x4 identity matrix.\n *\n * @since 1.1.0\n */\nexport const identity: Matrix4x4 = internal.identity\n\nexport const equals: {\n /**\n * Checks if two `Matrix4x4` instances are approximately equal within the\n * default absolute tolerance ({@link EPSILON}).\n *\n * @param a - The first matrix.\n * @param b - The second matrix.\n * @returns `true` when each pair of components is within tolerance.\n * @since 1.1.0\n */\n (a: Matrix4x4, b: Matrix4x4): boolean\n /**\n * Checks if two `Matrix4x4` instances are approximately equal within the\n * default absolute tolerance ({@link EPSILON}).\n *\n * @param b - The second matrix.\n * @returns A function that takes the first matrix and returns the comparison result.\n * @since 1.1.0\n */\n (b: Matrix4x4): (a: Matrix4x4) => boolean\n} = internal.equals\n\n/**\n * Creates a new `Matrix4x4` instance.\n *\n * @param m00 - The value of the first row and first column.\n * @param m01 - The value of the first row and second column.\n * @param m02 - The value of the first row and third column.\n * @param m03 - The value of the first row and fourth column.\n * @param m10 - The value of the second row and first column.\n * @param m11 - The value of the second row and second column.\n * @param m12 - The value of the second row and third column.\n * @param m13 - The value of the second row and fourth column.\n * @param m20 - The value of the third row and first column.\n * @param m21 - The value of the third row and second column.\n * @param m22 - The value of the third row and third column.\n * @param m23 - The value of the third row and fourth column.\n * @param m30 - The value of the fourth row and first column.\n * @param m31 - The value of the fourth row and second column.\n * @param m32 - The value of the fourth row and third column.\n * @param m33 - The value of the fourth row and fourth column.\n * @returns A new `Matrix4x4` instance.\n * @since 1.0.0\n */\nexport const make: (\n m00?: number,\n m01?: number,\n m02?: number,\n m03?: number,\n m10?: number,\n m11?: number,\n m12?: number,\n m13?: number,\n m20?: number,\n m21?: number,\n m22?: number,\n m23?: number,\n m30?: number,\n m31?: number,\n m32?: number,\n m33?: number,\n) => Matrix4x4 = internal.make\n\n/**\n * Creates a new `Matrix4x4` instance from four row vectors.\n *\n * @param v0 - The first row vector.\n * @param v1 - The second row vector.\n * @param v2 - The third row vector.\n * @param v3 - The fourth row vector.\n * @returns A new `Matrix4x4` instance.\n * @since 1.0.0\n */\nexport const fromRows: (v0: Vector4, v1: Vector4, v2: Vector4, v3: Vector4) => Matrix4x4 =\n internal.fromRows\n\n/**\n * Creates a new `Matrix4x4` instance from four column vectors.\n *\n * @param v0 - The first column vector.\n * @param v1 - The second column vector.\n * @param v2 - The third column vector.\n * @param v3 - The fourth column vector.\n */\nexport const fromColumns: (v0: Vector4, v1: Vector4, v2: Vector4, v3: Vector4) => Matrix4x4 =\n internal.fromColumns\n\nexport const setRow: {\n /**\n * Sets a row of a `Matrix4x4` to a new vector.\n *\n * @param m - The matrix to modify.\n * @param row - The row to set.\n * @param v - The new vector.\n * @returns A new `Matrix4x4` instance with the specified row set to the new vector.\n * @since 1.0.0\n */\n (m: Matrix4x4, row: Matrix4x4Coordinate, v: Vector4): Matrix4x4\n /**\n * Sets a row of a `Matrix4x4` to a new vector.\n *\n * @param row - The row to set.\n * @param v - The new vector.\n * @returns A function that takes a matrix and returns a new `Matrix4x4` instance with the specified row set to the new vector.\n * @since 1.0.0\n */\n (row: Matrix4x4Coordinate, v: Vector4): (m: Matrix4x4) => Matrix4x4\n} = internal.setRow\n\nexport const setColumn: {\n /**\n * Sets a column of a `Matrix4x4` to a new vector.\n *\n * @param m - The matrix to modify.\n * @param column - The column to set.\n * @param v - The new vector.\n * @returns A new `Matrix4x4` instance with the specified column set to the new vector.\n * @since 1.0.0\n */\n (m: Matrix4x4, column: Matrix4x4Coordinate, v: Vector4): Matrix4x4\n /**\n * Sets a column of a `Matrix4x4` to a new vector.\n *\n * @param column - The column to set.\n * @param v - The new vector.\n * @returns A function that takes a matrix and returns a new `Matrix4x4` instance with the specified column set to the new vector.\n * @since 1.0.0\n */\n (column: Matrix4x4Coordinate, v: Vector4): (m: Matrix4x4) => Matrix4x4\n} = internal.setColumn\n\n/**\n * Calculates the determinant of a `Matrix4x4`.\n *\n * @param m - The matrix to calculate the determinant of.\n * @returns The determinant of the matrix.\n * @since 1.0.0\n */\nexport const determinant: (m: Matrix4x4) => number = internal.determinant\n\n/**\n * Calculates the minor of a `Matrix4x4` at a given row and column.\n *\n * @param m - The matrix to calculate the minor of.\n * @param row - The row to exclude.\n * @param column - The column to exclude.\n * @returns The minor of the matrix at the given row and column.\n */\nexport const minor: (\n m: Matrix4x4,\n row: Matrix4x4Coordinate,\n column: Matrix4x4Coordinate,\n) => Matrix3x3 = internal.minor\n\nexport const vectorProductLeft: {\n /**\n * Calculates the left vector product of a `Matrix4x4` and a `Vector4`.\n *\n * @example\n * ```ts\n * import * as Matrix4x4 from 'curvy/matrix4x4'\n * import * as Vector4 from 'curvy/vector4'\n *\n * const m = Matrix4x4.make(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)\n * const v = Vector4.make(17, 18, 19, 20)\n *\n * // Result:\n * // x = 1 * 17 + 2 * 18 + 3 * 19 + 4 * 20\n * // y = 5 * 17 + 6 * 18 + 7 * 19 + 8 * 20\n * // z = 9 * 17 + 10 * 18 + 11 * 19 + 12 * 20\n * // w = 13 * 17 + 14 * 18 + 15 * 19 + 16 * 20\n * const result = Matrix4x4.vectorProductLeft(m, v)\n * ```\n * @param m - The matrix to multiply.\n * @param v - The vector to multiply.\n * @returns The resulting vector.\n * @since 1.0.0\n */\n (m: Matrix4x4, v: Vector4): Vector4\n /**\n * Calculates the left vector product of a `Matrix4x4` and a `Vector4`.\n *\n * @example\n * ```ts\n * import * as Matrix4x4 from 'curvy/matrix4x4'\n * import * as Vector4 from 'curvy/vector4'\n *\n * const m = Matrix4x4.make(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)\n * const v = Vector4.make(17, 18, 19, 20)\n *\n * // Result:\n * // x = 1 * 17 + 2 * 18 + 3 * 19 + 4 * 20\n * // y = 5 * 17 + 6 * 18 + 7 * 19 + 8 * 20\n * // z = 9 * 17 + 10 * 18 + 11 * 19 + 12 * 20\n * // w = 13 * 17 + 14 * 18 + 15 * 19 + 16 * 20\n * const result = Matrix4x4.vectorProductLeft(v)(m)\n * ```\n * @since 1.0.0\n */\n (v: Vector4): (m: Matrix4x4) => Vector4\n} = internal.vectorProductLeft\n\nexport const vectorProductRight: {\n /**\n * Calculates the right vector product of a `Matrix4x4` and a `Vector4`.\n *\n * @example\n * ```ts\n * import * as Matrix4x4 from 'curvy/matrix4x4'\n * import * as Vector4 from 'curvy/vector4'\n *\n * const m = Matrix4x4.make(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)\n * const v = Vector4.make(17, 18, 19, 20)\n *\n * // Result:\n * // x = 1 * 17 + 5 * 18 + 9 * 19 + 13 * 20\n * // y = 2 * 17 + 6 * 18 + 10 * 19 + 14 * 20\n * // z = 3 * 17 + 7 * 18 + 11 * 19 + 15 * 20\n * // w = 4 * 17 + 8 * 18 + 12 * 19 + 16 * 20\n * const result = Matrix4x4.vectorProductRight(m, v)\n * ```\n * @since 1.0.0\n */\n (m: Matrix4x4, v: Vector4): Vector4\n /**\n * Calculates the right vector product of a `Matrix4x4` and a `Vector4`.\n *\n * @example\n * ```ts\n * import * as Matrix4x4 from 'curvy/matrix4x4'\n * import * as Vector4 from 'curvy/vector4'\n *\n * const m = Matrix4x4.make(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)\n * const v = Vector4.make(17, 18, 19, 20)\n *\n * // Result:\n * // x = 1 * 17 + 5 * 18 + 9 * 19 + 13 * 20\n * // y = 2 * 17 + 6 * 18 + 10 * 19 + 14 * 20\n * // z = 3 * 17 + 7 * 18 + 11 * 19 + 15 * 20\n * // w = 4 * 17 + 8 * 18 + 12 * 19 + 16 * 20\n * const result = Matrix4x4.vectorProductRight(v)(m)\n * ```\n * @since 1.0.0\n */\n (v: Vector4): (m: Matrix4x4) => Vector4\n} = internal.vectorProductRight\n\nexport const multiply: {\n /**\n * Multiplies two `Matrix4x4` instances. Result is `a · b`.\n *\n * @param a - The left-hand matrix.\n * @param b - The right-hand matrix.\n * @returns The product matrix.\n * @since 1.1.0\n */\n (a: Matrix4x4, b: Matrix4x4): Matrix4x4\n /**\n * Multiplies two `Matrix4x4` instances. Result is `a · b`.\n *\n * @param b - The right-hand matrix.\n * @returns A function that takes the left-hand matrix and returns the product.\n * @since 1.1.0\n */\n (b: Matrix4x4): (a: Matrix4x4) => Matrix4x4\n} = internal.multiply\n\n/**\n * Returns the inverse of a `Matrix4x4`.\n *\n * Throws when the matrix is singular (determinant is zero).\n *\n * @param m - The matrix to invert.\n * @returns The inverse matrix.\n * @since 1.1.0\n */\nexport const inverse: (m: Matrix4x4) => Matrix4x4 = internal.inverse\n\nexport const solveSystem: {\n /**\n * Solves a system of linear equations represented by a `Matrix4x4` and a `Vector4`.\n *\n * @param m - The matrix representing the coefficients of the equations.\n * @param v - The vector representing the constants of the equations.\n * @returns The solution vector.\n * @since 1.0.0\n */\n (m: Matrix4x4, v: Vector4): Vector4\n /**\n * Solves a system of linear equations represented by a `Matrix4x4` and a `Vector4`.\n *\n * @param v - The vector representing the constants of the equations.\n * @returns A function that takes a matrix and returns the solution vector.\n * @since 1.0.0\n */\n (v: Vector4): (m: Matrix4x4) => Vector4\n} = internal.solveSystem\n\n/**\n * Returns the rows of a `Matrix4x4` as an array of vectors.\n *\n * @param m - The matrix to convert.\n * @returns An array of vectors representing the rows of the matrix.\n * @since 1.0.0\n */\nexport const toRows: (m: Matrix4x4) => [Vector4, Vector4, Vector4, Vector4] = internal.toRows as (\n m: Matrix4x4,\n) => [Vector4, Vector4, Vector4, Vector4]\n\n/**\n * Returns the columns of a `Matrix4x4` as an array of vectors.\n *\n * @param m - The matrix to convert.\n * @returns An array of vectors representing the columns of the matrix.\n * @since 1.0.0\n */\nexport const toColumns: (m: Matrix4x4) => [Vector4, Vector4, Vector4, Vector4] =\n internal.toColumns as (m: Matrix4x4) => [Vector4, Vector4, Vector4, Vector4]\n\nexport const rowVector: {\n /**\n * Returns a row vector from a `Matrix4x4`.\n *\n * @param m - The matrix to get the row vector from.\n * @param row - The row index.\n * @returns The row vector.\n * @since 1.0.0\n */\n (m: Matrix4x4, row: Matrix4x4Coordinate): Vector4\n /**\n * Returns a row vector from a `Matrix4x4`.\n *\n * @param row - The row index.\n * @returns A function that takes a matrix and returns the row vector.\n * @since 1.0.0\n */\n (row: Matrix4x4Coordinate): (m: Matrix4x4) => Vector4\n} = internal.rowVector\n\nexport const columnVector: {\n /**\n * Returns a column vector from a `Matrix4x4`.\n *\n * @param m - The matrix to get the column vector from.\n * @param column - The column index.\n * @returns The column vector.\n * @since 1.0.0\n */\n (m: Matrix4x4, column: Matrix4x4Coordinate): Vector4\n /**\n * Returns a column vector from a `Matrix4x4`.\n *\n * @param column - The column index.\n * @returns A function that takes a matrix and returns the column vector.\n * @since 1.0.0\n */\n (column: Matrix4x4Coordinate): (m: Matrix4x4) => Vector4\n} = internal.columnVector\n\n/**\n * Transposes a `Matrix4x4`.\n *\n * @param m - The matrix to transpose.\n * @returns The transposed matrix.\n * @since 1.0.0\n */\nexport const transpose: (m: Matrix4x4) => Matrix4x4 = internal.transpose\n\n/**\n * Reverses the rows of a `Matrix4x4`.\n *\n * @param m - The matrix to reverse the rows of.\n * @returns The matrix with the rows reversed.\n * @since 1.0.0\n */\nexport const reverseRows: (m: Matrix4x4) => Matrix4x4 = internal.reverseRows\n\n/**\n * Reverses the columns of a `Matrix4x4`.\n *\n * @param m - The matrix to reverse the columns of.\n * @returns The matrix with the columns reversed.\n * @since 1.0.0\n */\nexport const reverseColumns: (m: Matrix4x4) => Matrix4x4 = internal.reverseColumns\n"],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- import { t as __exportAll } from "./chunk-25Hzd3z8.mjs";
2
- //#region src/monotonicity/monotonicity.ts
3
- var monotonicity_exports = /* @__PURE__ */ __exportAll({
4
- Constant: () => 0,
5
- Decreasing: () => 2,
6
- Increasing: () => 1,
7
- None: () => 3,
8
- fromComparison: () => fromComparison,
9
- isStrict: () => isStrict
10
- });
11
- /**
12
- * Type-narrowing predicate: refines a `Monotonicity` to `Increasing |
13
- * Decreasing` — the strict cases that admit a unique inverse.
14
- *
15
- * @param m - The monotonicity classification.
16
- * @returns `true` when `m` is `Increasing` or `Decreasing`.
17
- * @since 2.0.0
18
- */
19
- const isStrict = (m) => m === 1 || m === 2;
20
- /**
21
- * Classifies the monotonicity of a function given its values at two interval
22
- * endpoints, when the function is known a priori to be monotonic on the
23
- * spanning interval (e.g. a linear polynomial).
24
- *
25
- * @param s0 - The function value at the start of the interval.
26
- * @param s1 - The function value at the end of the interval.
27
- * @returns The classification — `Increasing`, `Decreasing`, or `Constant`.
28
- * @since 2.0.0
29
- */
30
- const fromComparison = (s0, s1) => s0 < s1 ? 1 : s0 > s1 ? 2 : 0;
31
- //#endregion
32
- export { isStrict as n, monotonicity_exports as r, fromComparison as t };
33
-
34
- //# sourceMappingURL=monotonicity-BdebFOtv.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"monotonicity-BdebFOtv.mjs","names":[],"sources":["../../src/monotonicity/monotonicity.ts"],"sourcesContent":["/**\n * Classification of a function's monotonicity on an interval.\n *\n * Encoded as a 2-bit sign-coverage bitmask of the function's derivative:\n * - bit 0 (`Increasing`) — derivative takes positive values\n * - bit 1 (`Decreasing`) — derivative takes negative values\n *\n * The four states fall out of the encoding:\n *\n * | value | name | derivative on the interval |\n * |-------|--------------|-----------------------------------|\n * | `0` | `Constant` | ≡ 0 |\n * | `1` | `Increasing` | ≥ 0, with at least one `> 0` |\n * | `2` | `Decreasing` | ≤ 0, with at least one `< 0` |\n * | `3` | `None` | crosses zero |\n *\n * The numeric encoding is principled, not arbitrary: the bitwise OR of two\n * adjacent subintervals' classifications gives the classification of their\n * union, which lets monotonicity be computed by recursive subdivision\n * without any custom combine logic.\n *\n * @since 2.0.0\n */\nexport type Monotonicity = 0 | 1 | 2 | 3\n\n/**\n * Subset of {@link Monotonicity} excluding the indeterminate `None` state.\n * Returned by classifiers operating on functions whose derivative cannot\n * change sign on the interval (e.g. linear polynomials, whose derivative is\n * constant).\n *\n * @since 2.0.0\n */\nexport type GuaranteedMonotonicity = 0 | 1 | 2\n\n/**\n * Derivative is identically zero on the interval. The function is constant.\n *\n * @since 2.0.0\n */\nexport const Constant = 0 as const\n\n/**\n * Derivative is non-negative on the interval with at least one strictly\n * positive sample. The function is strictly increasing.\n *\n * @since 2.0.0\n */\nexport const Increasing = 1 as const\n\n/**\n * Derivative is non-positive on the interval with at least one strictly\n * negative sample. The function is strictly decreasing.\n *\n * @since 2.0.0\n */\nexport const Decreasing = 2 as const\n\n/**\n * Derivative crosses zero on the interval. The function has at least one\n * interior extremum and is not monotonic in either direction.\n *\n * @since 2.0.0\n */\nexport const None = 3 as const\n\n/**\n * Type-narrowing predicate: refines a `Monotonicity` to `Increasing |\n * Decreasing` — the strict cases that admit a unique inverse.\n *\n * @param m - The monotonicity classification.\n * @returns `true` when `m` is `Increasing` or `Decreasing`.\n * @since 2.0.0\n */\nexport const isStrict = (m: Monotonicity): m is 1 | 2 => m === Increasing || m === Decreasing\n\n/**\n * Classifies the monotonicity of a function given its values at two interval\n * endpoints, when the function is known a priori to be monotonic on the\n * spanning interval (e.g. a linear polynomial).\n *\n * @param s0 - The function value at the start of the interval.\n * @param s1 - The function value at the end of the interval.\n * @returns The classification — `Increasing`, `Decreasing`, or `Constant`.\n * @since 2.0.0\n */\nexport const fromComparison = (s0: number, s1: number): GuaranteedMonotonicity =>\n s0 < s1 ? Increasing : s0 > s1 ? Decreasing : Constant\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0EA,MAAa,YAAY,MAAgC,MAAA,KAAoB,MAAA;;;;;;;;;;;AAY7E,MAAa,kBAAkB,IAAY,OACzC,KAAK,KAAA,IAAkB,KAAK,KAAA,IAAA"}