From 12c6f4e95fe8cee0753afeda8b28fca73ad0c6d1 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 18 Feb 2024 15:30:24 +0100 Subject: [PATCH 01/12] Update signal.mjs added pickr() and pickrmod() --- packages/core/signal.mjs | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index c70805d8..270f81be 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -244,6 +244,30 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { return pat.apply(pickmod(lookup, funcs)); }); +/** +/** * Picks patterns (or plain values) either from a list (by index) or a lookup table (by name). + * Similar to `pick`, but restart() is invoked everytime a new index is triggered. + * In case of stacked indexes, collect() function is used to avoid multiple restarting triggers + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickr = register('pickr', function (lookup, pat) { + return _pick(lookup.map((x)=>x.restart(pat.collect().fmap(v=>v+1))), pat, false).innerJoin(); +}); + +/** * The same as `pickr`, but if you pick a number greater than the size of the list, + * it wraps around, rather than sticking at the maximum value. + * For example, if you pick the fifth pattern of a list of three, you'll get the + * second one. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickrmod = register('pickrmod', function (lookup, pat) { + return _pick(lookup.map((x)=>x.restart(pat.collect().fmap(v=>v+1))), pat, true).innerJoin(); +}); + /** /** * Picks patterns (or plain values) either from a list (by index) or a lookup table (by name). * Similar to `pick`, but cycles are squeezed into the target ('inhabited') pattern. @@ -258,7 +282,7 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { * s("a@2 [a b] a".inhabit({a: "bd(3,8)", b: "sd sd"})).slow(4) */ export const inhabit = register('inhabit', function (lookup, pat) { - return _pick(lookup, pat, true).squeezeJoin(); + return _pick(lookup, pat, false).squeezeJoin(); }); /** * The same as `inhabit`, but if you pick a number greater than the size of the list, @@ -270,8 +294,8 @@ export const inhabit = register('inhabit', function (lookup, pat) { * @returns {Pattern} */ -export const inhabitmod = register('inhabit', function (lookup, pat) { - return _pick(lookup, pat, false).squeezeJoin(); +export const inhabitmod = register('inhabitmod', function (lookup, pat) { + return _pick(lookup, pat, true).squeezeJoin(); }); /** From 23c55c963662b3892a7ebf17d2706cfe06d4f184 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 18 Feb 2024 16:03:01 +0100 Subject: [PATCH 02/12] Update signal.mjs prettier fix --- packages/core/signal.mjs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 270f81be..12e0043d 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -253,7 +253,11 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { * @returns {Pattern} */ export const pickr = register('pickr', function (lookup, pat) { - return _pick(lookup.map((x)=>x.restart(pat.collect().fmap(v=>v+1))), pat, false).innerJoin(); + return _pick( + lookup.map((x) => x.restart(pat.collect().fmap((v) => v + 1))), + pat, + false, + ).innerJoin(); }); /** * The same as `pickr`, but if you pick a number greater than the size of the list, @@ -265,7 +269,11 @@ export const pickr = register('pickr', function (lookup, pat) { * @returns {Pattern} */ export const pickrmod = register('pickrmod', function (lookup, pat) { - return _pick(lookup.map((x)=>x.restart(pat.collect().fmap(v=>v+1))), pat, true).innerJoin(); + return _pick( + lookup.map((x) => x.restart(pat.collect().fmap((v) => v + 1))), + pat, + true, + ).innerJoin(); }); /** From 03a73fb95e5246f8108095c8f026b366220fc032 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 18 Feb 2024 16:21:50 +0100 Subject: [PATCH 03/12] Update signal.mjs Fixed pickr() description --- packages/core/signal.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 12e0043d..f8a8426d 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -244,9 +244,7 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { return pat.apply(pickmod(lookup, funcs)); }); -/** -/** * Picks patterns (or plain values) either from a list (by index) or a lookup table (by name). - * Similar to `pick`, but restart() is invoked everytime a new index is triggered. +/** * Similar to `pick`, but restart() is invoked everytime a new index is triggered. * In case of stacked indexes, collect() function is used to avoid multiple restarting triggers * @param {Pattern} pat * @param {*} xs From 88ece92a78a63f53155b655018a9b12708f9a168 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 18 Feb 2024 16:40:27 +0100 Subject: [PATCH 04/12] Update signal.mjs Make pickr() handle dictionaries also --- packages/core/signal.mjs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index f8a8426d..a2bc42d2 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -160,7 +160,7 @@ export const _irand = (i) => rand.fmap((x) => Math.trunc(x * i)); */ export const irand = (ipat) => reify(ipat).fmap(_irand).innerJoin(); -const _pick = function (lookup, pat, modulo = true) { +const _pick = function (lookup, pat, modulo = true, restart = false) { const array = Array.isArray(lookup); const len = Object.keys(lookup).length; @@ -174,7 +174,7 @@ const _pick = function (lookup, pat, modulo = true) { if (array) { key = modulo ? Math.round(key) % len : clamp(Math.round(key), 0, lookup.length - 1); } - return lookup[key]; + return restart ? lookup[key].restart(pat.collect().fmap((v) => v + 1)) : lookup[key]; }); }; @@ -251,11 +251,7 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { * @returns {Pattern} */ export const pickr = register('pickr', function (lookup, pat) { - return _pick( - lookup.map((x) => x.restart(pat.collect().fmap((v) => v + 1))), - pat, - false, - ).innerJoin(); + return _pick(lookup, pat, false, true).innerJoin(); }); /** * The same as `pickr`, but if you pick a number greater than the size of the list, @@ -267,11 +263,7 @@ export const pickr = register('pickr', function (lookup, pat) { * @returns {Pattern} */ export const pickrmod = register('pickrmod', function (lookup, pat) { - return _pick( - lookup.map((x) => x.restart(pat.collect().fmap((v) => v + 1))), - pat, - true, - ).innerJoin(); + return _pick(lookup, pat, true, true).innerJoin(); }); /** From 3347817350d3b24511ca058efefe50285a667ef5 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 18 Feb 2024 18:41:06 +0100 Subject: [PATCH 05/12] Update signal.mjs using trigZeroJoin in pickr() instead --- packages/core/signal.mjs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index a2bc42d2..7bc97c7b 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -160,7 +160,7 @@ export const _irand = (i) => rand.fmap((x) => Math.trunc(x * i)); */ export const irand = (ipat) => reify(ipat).fmap(_irand).innerJoin(); -const _pick = function (lookup, pat, modulo = true, restart = false) { +const _pick = function (lookup, pat, modulo = true) { const array = Array.isArray(lookup); const len = Object.keys(lookup).length; @@ -174,7 +174,7 @@ const _pick = function (lookup, pat, modulo = true, restart = false) { if (array) { key = modulo ? Math.round(key) % len : clamp(Math.round(key), 0, lookup.length - 1); } - return restart ? lookup[key].restart(pat.collect().fmap((v) => v + 1)) : lookup[key]; + return lookup[key]; }); }; @@ -244,14 +244,13 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { return pat.apply(pickmod(lookup, funcs)); }); -/** * Similar to `pick`, but restart() is invoked everytime a new index is triggered. - * In case of stacked indexes, collect() function is used to avoid multiple restarting triggers +/** * Similar to `pick`, but the choosen pattern is restarted when its index is triggered. * @param {Pattern} pat * @param {*} xs * @returns {Pattern} */ export const pickr = register('pickr', function (lookup, pat) { - return _pick(lookup, pat, false, true).innerJoin(); + return _pick(lookup, pat, false).trigzeroJoin(); }); /** * The same as `pickr`, but if you pick a number greater than the size of the list, @@ -263,7 +262,7 @@ export const pickr = register('pickr', function (lookup, pat) { * @returns {Pattern} */ export const pickrmod = register('pickrmod', function (lookup, pat) { - return _pick(lookup, pat, true, true).innerJoin(); + return _pick(lookup, pat, true).trigzeroJoin(); }); /** From 00c7da45c0a43fb285e217b1375482667bffadc5 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 18 Feb 2024 18:55:05 +0100 Subject: [PATCH 06/12] Update signal.mjs now pickRestart() and pickReset() --- packages/core/signal.mjs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 7bc97c7b..e468b0d1 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -249,22 +249,39 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { * @param {*} xs * @returns {Pattern} */ -export const pickr = register('pickr', function (lookup, pat) { +export const pickRestart = register('pickRestart', function (lookup, pat) { return _pick(lookup, pat, false).trigzeroJoin(); }); /** * The same as `pickr`, but if you pick a number greater than the size of the list, * it wraps around, rather than sticking at the maximum value. - * For example, if you pick the fifth pattern of a list of three, you'll get the - * second one. * @param {Pattern} pat * @param {*} xs * @returns {Pattern} */ -export const pickrmod = register('pickrmod', function (lookup, pat) { +export const pickmodRestart = register('pickmodRestart', function (lookup, pat) { return _pick(lookup, pat, true).trigzeroJoin(); }); +/** * Similar to `pick`, but the choosen pattern is reset when its index is triggered. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickReset = register('pickReset', function (lookup, pat) { + return _pick(lookup, pat, false).trigJoin(); +}); + +/** * The same as `pickr`, but if you pick a number greater than the size of the list, + * it wraps around, rather than sticking at the maximum value. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickmodReset = register('pickmodReset', function (lookup, pat) { + return _pick(lookup, pat, true).trigJoin(); +}); + /** /** * Picks patterns (or plain values) either from a list (by index) or a lookup table (by name). * Similar to `pick`, but cycles are squeezed into the target ('inhabited') pattern. From d5e67fe13fad29f4a87e5343dcc6bb15032b4fb2 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 18 Feb 2024 19:01:05 +0100 Subject: [PATCH 07/12] Update signal.mjs typo --- packages/core/signal.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index e468b0d1..c645133d 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -253,7 +253,7 @@ export const pickRestart = register('pickRestart', function (lookup, pat) { return _pick(lookup, pat, false).trigzeroJoin(); }); -/** * The same as `pickr`, but if you pick a number greater than the size of the list, +/** * The same as `pickRestart`, but if you pick a number greater than the size of the list, * it wraps around, rather than sticking at the maximum value. * @param {Pattern} pat * @param {*} xs @@ -272,7 +272,7 @@ export const pickReset = register('pickReset', function (lookup, pat) { return _pick(lookup, pat, false).trigJoin(); }); -/** * The same as `pickr`, but if you pick a number greater than the size of the list, +/** * The same as `pickReset`, but if you pick a number greater than the size of the list, * it wraps around, rather than sticking at the maximum value. * @param {Pattern} pat * @param {*} xs From 0986b14508345238210160fbcdda72b80dca0503 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 25 Feb 2024 14:31:07 +0100 Subject: [PATCH 08/12] added pickOuter, pickmodOuter --- packages/core/signal.mjs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index c645133d..cceb0a13 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -244,6 +244,25 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { return pat.apply(pickmod(lookup, funcs)); }); +/** * Similar to `pick`, but it applies an outerJoin instead of an innerJoin. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickOuter = register('pickOuter', function (lookup, pat) { + return _pick(lookup, pat, false).outerJoin(); +}); + +/** * The same as `pickRestart`, but if you pick a number greater than the size of the list, + * it wraps around, rather than sticking at the maximum value. + * @param {Pattern} pat + * @param {*} xs + * @returns {Pattern} + */ +export const pickmodOuter = register('pickmodOuter', function (lookup, pat) { + return _pick(lookup, pat, true).outerJoin(); +}); + /** * Similar to `pick`, but the choosen pattern is restarted when its index is triggered. * @param {Pattern} pat * @param {*} xs From dbfdbcf2b7bf057efdfa61be561e134b9e2763fc Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Sun, 25 Feb 2024 14:39:38 +0100 Subject: [PATCH 09/12] typo --- packages/core/signal.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index cceb0a13..998dcb26 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -253,7 +253,7 @@ export const pickOuter = register('pickOuter', function (lookup, pat) { return _pick(lookup, pat, false).outerJoin(); }); -/** * The same as `pickRestart`, but if you pick a number greater than the size of the list, +/** * The same as `pickOuter`, but if you pick a number greater than the size of the list, * it wraps around, rather than sticking at the maximum value. * @param {Pattern} pat * @param {*} xs From 4aaf9eaed4100b17f72d5c8f87cdd86aea38c977 Mon Sep 17 00:00:00 2001 From: eefano <77832+eefano@users.noreply.github.com> Date: Mon, 26 Feb 2024 00:35:00 +0100 Subject: [PATCH 10/12] mux operator, muxers.mjs with pick variants prettier prettier2 clamp? Revert "clamp?" This reverts commit 83a3b9123aece9f0e366c83d97f99e8b8d20db54. Revert "prettier2" This reverts commit de13871a8be4a450b79a4d9e65b9d1982485577e. Revert "prettier" This reverts commit 1550bf49527f591d05fa2766ca66ccb16e142011. Revert "mux operator, muxers.mjs with pick variants" This reverts commit af062f93c23ded4440f968186bfc69851d8aec67. From 0deb905cdf4702b3794aa9287d1db0ea4220bcab Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 29 Feb 2024 15:21:44 +0100 Subject: [PATCH 11/12] rename pick*Outer > pickOut + add pick*Squeeze alias to inhabit* --- packages/core/signal.mjs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 998dcb26..1d453646 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -249,17 +249,17 @@ export const pickmodF = register('pickmodF', function (lookup, funcs, pat) { * @param {*} xs * @returns {Pattern} */ -export const pickOuter = register('pickOuter', function (lookup, pat) { +export const pickOut = register('pickOut', function (lookup, pat) { return _pick(lookup, pat, false).outerJoin(); }); -/** * The same as `pickOuter`, but if you pick a number greater than the size of the list, +/** * The same as `pickOut`, but if you pick a number greater than the size of the list, * it wraps around, rather than sticking at the maximum value. * @param {Pattern} pat * @param {*} xs * @returns {Pattern} */ -export const pickmodOuter = register('pickmodOuter', function (lookup, pat) { +export const pickmodOut = register('pickmodOut', function (lookup, pat) { return _pick(lookup, pat, true).outerJoin(); }); @@ -314,7 +314,7 @@ export const pickmodReset = register('pickmodReset', function (lookup, pat) { * @example * s("a@2 [a b] a".inhabit({a: "bd(3,8)", b: "sd sd"})).slow(4) */ -export const inhabit = register('inhabit', function (lookup, pat) { +export const { inhabit, pickSqueeze } = register(['inhabit', 'pickSqueeze'], function (lookup, pat) { return _pick(lookup, pat, false).squeezeJoin(); }); @@ -327,7 +327,7 @@ export const inhabit = register('inhabit', function (lookup, pat) { * @returns {Pattern} */ -export const inhabitmod = register('inhabitmod', function (lookup, pat) { +export const { inhabitmod, pickmodSqueeze } = register(['inhabitmod', 'pickmodSqueeze'], function (lookup, pat) { return _pick(lookup, pat, true).squeezeJoin(); }); From c524ebc7f3caa4b95a5de0a4eb5af583a9c35105 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 29 Feb 2024 15:25:31 +0100 Subject: [PATCH 12/12] fix: add name tags --- packages/core/signal.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index 1d453646..7e9a9099 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -304,6 +304,8 @@ export const pickmodReset = register('pickmodReset', function (lookup, pat) { /** /** * Picks patterns (or plain values) either from a list (by index) or a lookup table (by name). * Similar to `pick`, but cycles are squeezed into the target ('inhabited') pattern. + * @name inhabit + * @synonyms pickSqueeze * @param {Pattern} pat * @param {*} xs * @returns {Pattern} @@ -322,6 +324,8 @@ export const { inhabit, pickSqueeze } = register(['inhabit', 'pickSqueeze'], fun * it wraps around, rather than sticking at the maximum value. * For example, if you pick the fifth pattern of a list of three, you'll get the * second one. + * @name inhabitmod + * @synonyms pickmodSqueeze * @param {Pattern} pat * @param {*} xs * @returns {Pattern}