refactor: change onType to match and take only one pattern and result (#22)
All checks were successful
/ test (push) Successful in 17s

Pursuant to #12. Besides changing the name of onType to match, and only allowing one pattern and result in `match()`,
this PR also arranges that in place of an onType with lots of alternating PATTERN, VALUE, PATTERN, VALUE arguments, one now exports an _array_ of `match(PATTERN, VALUE)` items.

Doesn't quite fully resolve #12, because there is still the question of whether `match(...)` can be left out for a behavior that literally matches anything (current behavior), or whether `match(Passthru, behavior)` should be required for such cases.

Reviewed-on: #22
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
This commit is contained in:
Glen Whitney 2025-04-22 05:01:21 +00:00 committed by Glen Whitney
parent 491e207fad
commit 236f46c0c0
22 changed files with 147 additions and 135 deletions

View file

@ -1,10 +1,10 @@
import {Complex} from './Complex.js'
import {onType} from "#core/helpers.js"
import {match} from "#core/helpers.js"
import {Returns} from "#core/Type.js"
import {Any} from "#core/TypePatterns.js"
export const complex = onType(
Any, (math, T) => {
export const complex = [
match(Any, (math, T) => {
const z = math.zero(T)
if (math.hasnan(T)) {
const isnan = math.isnan.resolve([T])
@ -15,8 +15,8 @@ export const complex = onType(
})
}
return Returns(Complex(T), r => ({re: r, im: z}))
},
[Any, Any], (math, [T, U]) => {
}),
match([Any, Any], (math, [T, U]) => {
if (T !== U) {
throw new RangeError(
'mixed complex types disallowed '
@ -24,5 +24,4 @@ export const complex = onType(
}
return Returns(Complex(T), (r, m) => ({re: r, im: m}))
})
]