diff --git a/strudel.mjs b/strudel.mjs index 9ea356102..51003d2f0 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 8db097417..008e7af99 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]]] + ) + ] + ) }) }) })