feat: extend all utils to vectors elementwise & fix parameter match grouping
This commit is contained in:
parent
f002310581
commit
3b882f3d53
5 changed files with 33 additions and 4 deletions
|
@ -51,7 +51,8 @@ class SequencePattern extends TypePattern {
|
||||||
const [newPos, newMatch] = pat.match(typeSequence, options)
|
const [newPos, newMatch] = pat.match(typeSequence, options)
|
||||||
if (newPos < 0) return [-1, Undefined]
|
if (newPos < 0) return [-1, Undefined]
|
||||||
options.position = newPos
|
options.position = newPos
|
||||||
matches.push(newMatch)
|
if (Array.isArray(newMatch)) matches.push(...newMatch)
|
||||||
|
else matches.push(newMatch)
|
||||||
}
|
}
|
||||||
return [options.position, matches]
|
return [options.position, matches]
|
||||||
}
|
}
|
||||||
|
@ -125,7 +126,7 @@ class OptionalPattern extends TypePattern {
|
||||||
options.position = newPos
|
options.position = newPos
|
||||||
matches.push(newMatch)
|
matches.push(newMatch)
|
||||||
}
|
}
|
||||||
return [options.position, matches]
|
return [options.position, [matches]]
|
||||||
}
|
}
|
||||||
sampleTypes() {return []}
|
sampleTypes() {return []}
|
||||||
equal(other) {
|
equal(other) {
|
||||||
|
@ -148,7 +149,7 @@ class MultiPattern extends TypePattern {
|
||||||
const matches = []
|
const matches = []
|
||||||
while (true) {
|
while (true) {
|
||||||
const [newPos, newMatch] = this.pattern.match(typeSequence, options)
|
const [newPos, newMatch] = this.pattern.match(typeSequence, options)
|
||||||
if (newPos < 0) return [options.position, matches]
|
if (newPos < 0) return [options.position, [matches]]
|
||||||
options.position = newPos
|
options.position = newPos
|
||||||
matches.push(newMatch)
|
matches.push(newMatch)
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,10 @@ describe('Type patterns', () => {
|
||||||
midOpt.match([Undefined, TypeOfTypes, TypeOfTypes]),
|
midOpt.match([Undefined, TypeOfTypes, TypeOfTypes]),
|
||||||
[-1, Undefined])
|
[-1, Undefined])
|
||||||
assert.deepStrictEqual(midOpt.sampleTypes(), [Undefined, Undefined])
|
assert.deepStrictEqual(midOpt.sampleTypes(), [Undefined, Undefined])
|
||||||
|
const justMulti = pattern(Multiple(Undefined))
|
||||||
|
assert.deepStrictEqual(
|
||||||
|
justMulti.match([Undefined, Undefined]),
|
||||||
|
[2, [[Undefined, Undefined]]])
|
||||||
const midMulti = pattern([Undefined, Multiple(TypeOfTypes), Undefined])
|
const midMulti = pattern([Undefined, Multiple(TypeOfTypes), Undefined])
|
||||||
assert.deepStrictEqual(
|
assert.deepStrictEqual(
|
||||||
midMulti.match([Undefined, Undefined]),
|
midMulti.match([Undefined, Undefined]),
|
||||||
|
|
|
@ -18,7 +18,7 @@ export const isZero = match(Passthru, (math, [T]) => {
|
||||||
const eq = math.equal.resolve([T, T])
|
const eq = math.equal.resolve([T, T])
|
||||||
return ReturnsAs(eq, x => eq(z, x))
|
return ReturnsAs(eq, x => eq(z, x))
|
||||||
})
|
})
|
||||||
export const nonImaginary = match(Passthru, boolnum(() => true))
|
export const nonImaginary = match(Any, boolnum(() => true))
|
||||||
export const re = match(Any, (_math, T) => Returns(T, t => t))
|
export const re = match(Any, (_math, T) => Returns(T, t => t))
|
||||||
export const im = match(Any, (math, T) => {
|
export const im = match(Any, (math, T) => {
|
||||||
const z = math.zero(T)
|
const z = math.zero(T)
|
||||||
|
|
|
@ -18,6 +18,23 @@ describe('Vector utility functions', () => {
|
||||||
assert(clone3[0] !== subj3[0])
|
assert(clone3[0] !== subj3[0])
|
||||||
assert(clone3[1] !== subj3[1])
|
assert(clone3[1] !== subj3[1])
|
||||||
})
|
})
|
||||||
|
it('performs utilities elementwise', () => {
|
||||||
|
const cplx = math.complex
|
||||||
|
const sink = math.vector(
|
||||||
|
NaN, -Infinity, 7,
|
||||||
|
cplx(3, 4), cplx(3.5, -2.5), cplx(2.2), cplx(cplx(3, 4))
|
||||||
|
)
|
||||||
|
const t = true, f = false
|
||||||
|
assert.deepStrictEqual(math.isnan(sink), [t, f, f, f, f, f, f])
|
||||||
|
assert.deepStrictEqual(math.isfinite(sink), [f, f, t, t, t, t, t])
|
||||||
|
assert.deepStrictEqual(math.isInteger(sink), [f, f, t, t, f, f, t])
|
||||||
|
assert.deepStrictEqual(math.isReal(sink), [t, t, t, f, f, t, f])
|
||||||
|
assert.deepStrictEqual(math.nonImaginary(sink), [t, t, t, f, f, t, t])
|
||||||
|
assert.deepStrictEqual(math.re(sink), [NaN, -Infinity, 7, 3, 3.5, 2.2, 3])
|
||||||
|
assert.deepStrictEqual(
|
||||||
|
math.im(sink),
|
||||||
|
[0, 0, 0, cplx(0, 4), cplx(0, -2.5), cplx(0, 0), cplx(cplx(0, 4))])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
import {promoteUnary} from './helpers.js'
|
import {promoteUnary} from './helpers.js'
|
||||||
|
|
||||||
export const clone = promoteUnary('clone')
|
export const clone = promoteUnary('clone')
|
||||||
|
export const isnan = promoteUnary('isnan')
|
||||||
|
export const isfinite = promoteUnary('isfinite')
|
||||||
|
export const isInteger = promoteUnary('isInteger')
|
||||||
|
export const isReal = promoteUnary('isReal')
|
||||||
|
export const nonImaginary = promoteUnary('nonImaginary')
|
||||||
|
export const re = promoteUnary('re')
|
||||||
|
export const im = promoteUnary('im')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue