From 912c36d590e12dce576d1744e7d9e8c0ec809ffb Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 25 Feb 2022 10:59:33 +0000 Subject: [PATCH] Add event/hap context --- strudel.mjs | 16 +++++++++++++++- test/pattern.test.mjs | 15 ++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) 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]]] + ) + ] + ) }) }) })