{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-seminars/EUD2020/project_2/collectionsBackprop.js"],"names":["_","search_replace","needle","subs","haystack","bubbler","isEqual","Array","isArray","forEach","el","i","match","slice","concat","isPlainObject","forIn","value","key","params","assign","pick","without","keys","minimalDelta","last","target","zip","filter","x","y","length","find","Object","k","backprop_nested","values","probes","targetValue","fn","currentValue","console","log","probe","found","id"],"mappings":"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","file":"collectionsBackprop.js","sourcesContent":["import _ from 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.19/lodash.js';\n\n// nested object backprop\n\n// for literals which are composed of other literals,\n// that is, arrays or objects composed of string\n// and numerical literals, it should be possible to\n// modify appropriate parts of that object\n\n// note that this may be orthogonal to numerical/string\n// backprop, but is probably only useful with copy \n// backprop due to performance considerations\n\n\n// copy backprop\n\n// this is for when you have a bit of data which is\n// shuffled around or whatever and eventually makes\n// its way somewhere else in a different form. this\n// is strictly less fine grained than string or \n// numerical, but it's theoretically faster and works\n// on more data types\n\n\n// recursively finds all instances of needle in the haystack\n// and creates a copy of the top level haystack each with\n// a single valid sustitution\n\nfunction search_replace(needle, subs, haystack, bubbler){\n    if(_.isEqual(needle, haystack)){\n        bubbler(subs)\n    }else if(Array.isArray(haystack)){\n        haystack.forEach((el, i) => {\n            // replace array elements\n            search_replace(needle, subs, el, function(match){\n                bubbler(haystack.slice(0, i).concat([match], haystack.slice(i + 1)))\n            })\n        })\n    }else if(_.isPlainObject(haystack)){\n        _.forIn(haystack, function(value, key){\n            // replace in values\n            search_replace(needle, subs, value, function(match){\n              let params = haystack;\n              params[key] = match;\n              bubbler(params);\n            })\n            // replace in keys\n            search_replace(needle, subs, key, function(match){\n                bubbler(_.assign(_.pick(haystack, _.without(_.keys(haystack), key)), {\n                    [match]: value\n                }))\n            })\n        })\n    }\n}\n\nfunction minimalDelta(last, target){\n    if(Array.isArray(last) && Array.isArray(target) \n        && _.zip(last, target).filter(([x, y]) => !_.isEqual(x, y)).length === 1){\n        return minimalDelta(..._.zip(last, target).find(([x, y]) => !_.isEqual(x, y)))\n    }\n\n\n    if(_.isPlainObject(last) && _.isPlainObject(target) \n        && Object.keys(last).length == Object.keys(target).length\n        && Object.keys(last).filter(k => last[k] != target[k]).length == 1){\n        var key = Object.keys(last).find(k => last[k] != target[k])\n        return minimalDelta(last[key], target[key])\n    }\n\n    return [last, target]\n}\n\nexport default async function backprop_nested(values, probes, targetValue, fn){\n    var currentValue = fn(values)\n    console.log('curr ' + currentValue)\n    console.log(probes)\n    console.log(targetValue)\n    var [last, target] = minimalDelta(currentValue, targetValue)\n\n    for(var i = 0; i < probes.length; i++){\n        var probe = probes[i];\n        var value = probe.value;\n\n        var found;\n        search_replace(last, target, value, function(match){\n            if(found) return;\n            if(_.isEqual(fn(match), targetValue)){\n              console.log('mat ' + match)\n              console.log('pid ' + probe.id)\n                found = match\n            }\n        })\n        console.log('fou')\n        console.log(found)\n        if(found) return found;\n    }\n    return null;\n}\n"]}