Add event/hap context

This commit is contained in:
alex 2022-02-25 10:59:33 +00:00
parent db22653124
commit 912c36d590
2 changed files with 29 additions and 2 deletions

View File

@ -172,12 +172,14 @@ class Hap {
then the whole will be returned as None, in which case the given
value will have been sampled from the point halfway between the
start and end of the 'part' timespan.
The context is to store a list of source code locations causing the event
*/
constructor(whole, part, value) {
constructor(whole, part, value, context=[]) {
this.whole = whole
this.part = part
this.value = value
this.context = context
}
withSpan(func) {
@ -214,6 +216,10 @@ class Hap {
show() {
return "(" + (this.whole == undefined ? "~" : this.whole.show()) + ", " + this.part.show() + ", " + this.value + ")"
}
setContext(context) {
return new Hap(this.whole, this.part, this.value, context)
}
}
export class State {
@ -298,6 +304,14 @@ class Pattern {
return new Pattern(state => func(this.query(state)))
}
_withEvent(func) {
return this._withEvents(events => events.map(func))
}
_setContext(context) {
return this._withEvent(event => event.setContext(context))
}
withLocation(location) {
return this.fmap(value => {
value = typeof value === 'object' && !Array.isArray(value) ? value : { value };

View File

@ -9,7 +9,7 @@ const { Time } = pkg;
const st = (begin, end) => new State(ts(begin, end))
const ts = (begin, end) => new TimeSpan(Fraction(begin), Fraction(end));
const hap = (whole, part, value) => new Hap(whole, part, value)
const hap = (whole, part, value, context=[]) => new Hap(whole, part, value, context)
const third = Fraction(1,3)
const twothirds = Fraction(2,3)
@ -328,6 +328,19 @@ describe('Pattern', function() {
isaw2.struct(true,true,true,true).firstCycle,
sequence(3/4,1/4,-1/4,-3/4).firstCycle
)
})
})
describe('_setContext()', () => {
it('Can set the event context', () => {
assert.deepStrictEqual(
pure("a")._setContext([[[0,1],[1,2]]]).firstCycle,
[hap(ts(0,1),
ts(0,1),
"a",
[[[0,1],[1,2]]]
)
]
)
})
})
})