diff --git a/strudel.mjs b/strudel.mjs index 9ea35610..51003d2f 100644 --- a/strudel.mjs +++ b/strudel.mjs @@ -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 }; diff --git a/test/pattern.test.mjs b/test/pattern.test.mjs index 8db09741..008e7af9 100644 --- a/test/pattern.test.mjs +++ b/test/pattern.test.mjs @@ -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]]] + ) + ] + ) }) }) })