From 5aece8488192f73a1172d66466e04a6231a551d2 Mon Sep 17 00:00:00 2001 From: jmoenig Date: Mon, 7 Dec 2020 13:27:29 +0100 Subject: [PATCH] integrated multimap primitive --- HISTORY.md | 2 ++ snap.html | 6 +++--- src/blocks.js | 9 ++++----- src/objects.js | 11 ++++++++--- src/threads.js | 10 +++++++--- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index fc3ed621..6fbb17a6 100755 --- a/HISTORY.md +++ b/HISTORY.md @@ -7,6 +7,7 @@ * hyperdyadic MIN and MAX primitives reachable via "relabel" * hyperdyadic less / great than or equals primitives reachable via "relabel" * new SIGN function in arithmetic dropdown + * new experimental compiled Multimap, thanks, Brian * **Notable Changes:** * searching for blocks and keyboard entry now includes the contents of dropdown menus * disabled dropping reporters into certain dropdowns (monadic functions, types, costume attributees, graphic effects, layers, audio attributes, pen attributes, dates, relation, keys, video attributes) @@ -22,6 +23,7 @@ ### 2020-12-07 * GUI: improved SVG loading, thanks, Joan! +* threads, objects, blocks: compiled multimap, thanks, Brian ### 2020-12-05 * objects: alternative collision detection method using the video-cache, commented out for reference. diff --git a/snap.html b/snap.html index 07e3ae4d..0d4e0e1b 100755 --- a/snap.html +++ b/snap.html @@ -8,9 +8,9 @@ - - - + + + diff --git a/src/blocks.js b/src/blocks.js index cdb694e0..9fd03eef 100644 --- a/src/blocks.js +++ b/src/blocks.js @@ -158,7 +158,7 @@ CustomCommandBlockMorph, SymbolMorph, ToggleButtonMorph, DialMorph*/ // Global stuff //////////////////////////////////////////////////////// -modules.blocks = '2020-December-04'; +modules.blocks = '2020-December-07'; var SyntaxElementMorph; var BlockMorph; @@ -2839,7 +2839,6 @@ BlockMorph.prototype.userMenu = function () { ) { alternatives = { reportMap : 'reportAtomicMap', - reportMap : 'reportAtomicMultimap', reportKeep : 'reportAtomicKeep', reportFindFirst: 'reportAtomicFindFirst', reportCombine : 'reportAtomicCombine' @@ -2854,7 +2853,7 @@ BlockMorph.prototype.userMenu = function () { contains( [ 'reportAtomicMap', - 'reportAtomicMultimap', + 'reportAtomicMultimap', 'reportAtomicKeep', 'reportAtomicFindFirst', 'reportAtomicCombine' @@ -2864,7 +2863,7 @@ BlockMorph.prototype.userMenu = function () { ) { alternatives = { reportAtomicMap : 'reportMap', - reportAtomicMultimap : 'reportMap', + reportAtomicMultimap : 'reportMap', reportAtomicKeep : 'reportKeep', reportAtomicFindFirst: 'reportFindFirst', reportAtomicCombine : 'reportCombine' @@ -11717,7 +11716,7 @@ MultiArgMorph.prototype.is3ArgRingInHOF = function () { [ 'reportMap', 'reportAtomicMap', - 'reportAtomicMultimap', + 'reportAtomicMultimap', 'reportKeep', 'reportAtomicKeep', 'reportFindFirst', diff --git a/src/objects.js b/src/objects.js index 40ed49d3..d57355d7 100644 --- a/src/objects.js +++ b/src/objects.js @@ -84,7 +84,7 @@ BlockEditorMorph, BlockDialogMorph, PrototypeHatBlockMorph, BooleanSlotMorph, localize, TableMorph, TableFrameMorph, normalizeCanvas, VectorPaintEditorMorph, AlignmentMorph, Process, WorldMap, copyCanvas, useBlurredShadows*/ -modules.objects = '2020-December-05'; +modules.objects = '2020-December-07'; var SpriteMorph; var StageMorph; @@ -1385,7 +1385,7 @@ SpriteMorph.prototype.initBlocks = function () { dev: true, // not shown in palette, only accessible via relabelling type: 'reporter', category: 'lists', - spec: '%blitz map %repRing over %lists' + spec: '%blitz multimap %repRing over %lists' }, reportKeep: { type: 'reporter', @@ -1694,7 +1694,12 @@ SpriteMorph.prototype.blockAlternatives = { reportKeep: ['reportFindFirst', 'reportMap'], reportFindFirst: ['reportKeep', 'reportMap'], doForEach: [['doFor', 1], ['doForever', -2], ['doRepeat', -1], - ['doUntil', -1]] + ['doUntil', -1]], + + // lists - special hidden HOFs + reportAtomicMap: ['reportAtomicMultimap'], + reportAtomicMultimap: ['reportAtomicMap'] + }; // SpriteMorph instance creation diff --git a/src/threads.js b/src/threads.js index 6b87e631..25ab605f 100644 --- a/src/threads.js +++ b/src/threads.js @@ -61,7 +61,7 @@ StageMorph, SpriteMorph, StagePrompterMorph, Note, modules, isString, copy, Map, isNil, WatcherMorph, List, ListWatcherMorph, alert, console, TableMorph, BLACK, TableFrameMorph, ColorSlotMorph, isSnapObject, newCanvas, Symbol, SVG_Costume*/ -modules.threads = '2020-December-04'; +modules.threads = '2020-December-07'; var ThreadManager; var Process; @@ -6113,11 +6113,15 @@ Process.prototype.reportAtomicMultimap = function (reporter, list) { // #3 - optional | source list this.assertType(list, 'list'); + if (list.itemsArray().length == 1) { + return this.reportAtomicMap(reporter, list.at(1)); + } var result = [], src = list.itemsArray().map(onelist => onelist.itemsArray()), len = src[1].length, width = src.length, formalParameterCount = reporter.inputs.length, + column = (list, index) => list.map(row => row[index]), parms, func, i; @@ -6140,9 +6144,9 @@ Process.prototype.reportAtomicMultimap = function (reporter, list) { for (i = 0; i < len; i += 1) { if (formalParameterCount > 0) { - parms = [new List(src.map(onearg => onearg[i]))]; + parms = [new List(column(src, i))]; } else { - parms = src.map(onearg => onearg[i]); + parms = column(src, i); } if (formalParameterCount > 1) { parms.push(i + 1);