{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tabs/src/babylonian-programming-editor/utils/tracker.js"],"names":["defaultExample","deepCopy","DefaultMap","Tracker","constructor","ids","builder","Object","idIterationParents","iterations","errors","Map","executedBlocks","Set","exampleIds","add","exampleId","timer","Timer","_identities","_symbolProvider","IdentitySymbolProvider","reset","clear","id","iterationParentId","runId","value","name","keyword","originalValue","prototype","includes","set","has","__tracker_identity","get","next","type","CanvasRenderingContext2D","getImageData","canvas","width","height","__tracker_time","Date","now","block","iteration","iterationMap","iterationCount","error","errorMsg","Zone","current","babylonianExampleId","example","_identitySymbols","_index","length","MaxRuntime","_maxRuntime","_startTime","start","check","time","Error"],"mappings":"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","file":"tracker.js","sourcesContent":["import { defaultExample } from \"./defaults.js\";\nimport { deepCopy } from \"./utils.js\";\nimport { DefaultMap } from \"./collections.js\";\n\nexport default class Tracker {\n  \n  constructor() {\n    this.ids = new DefaultMap( // Map(id, Map(exampleId, Map(runId, {before, after: {type, value, name}]})) \n      DefaultMap.builder(\n        DefaultMap.builder(Object)\n      )\n    );\n    this.idIterationParents = new DefaultMap(0); // Map(id, iterationId); \n    this.iterations = new DefaultMap( // Map(id, Map(exampleId, iterationCounter))\n      DefaultMap.builder(0)\n    );\n    this.errors = new Map(); // Map(exampleId, errorMsg);\n    this.executedBlocks = new Set(); // Set(id)\n    // this.exampleId = defaultExample().id;\n    this.exampleIds = new Set();\n    this.exampleIds.add(this.exampleId);\n    this.timer = new Timer();\n    this._identities = new Map(); // Map(identity, symbol)\n    this._symbolProvider = new IdentitySymbolProvider();\n  }\n  \n  reset() {\n    this.ids.clear();\n    this.idIterationParents.clear();\n    this.iterations.clear();\n    this.errors.clear();\n    this.executedBlocks.clear();\n    this.exampleId = defaultExample().id;\n    this.exampleIds.clear();\n    this.exampleIds.add(this.exampleId);\n    this._identities.clear();\n    this._symbolProvider.reset();\n  }\n\n  id(id, exampleId, iterationParentId, runId, value, name, keyword = \"after\") {\n    const originalValue = value;\n    let prototype;\n    \n    \n    // console.log('TRACKER ID ' + id \n    //             + \" exampleId: \" + exampleId \n    //             +  \" iterationParentId: \" + iterationParentId\n    //             +  \" runId: \" + runId\n    //             + \" Value: \" + value\n    //             + \" keyword:\" + keyword)\n    // #TODO #ContinueHere for implementing aysnc Babylonian Programming....\n    // next steps is signalling that this item has changed and might be in need for updating...\n    if(![\"before\", \"after\"].includes(keyword)) {\n      return value;\n    }\n    this.idIterationParents.set(id, iterationParentId);\n   \n    // Check and assign object identity\n    if(value instanceof Object) {\n      if(this._identities.has(value)) {\n        value.__tracker_identity = this._identities.get(value);\n      } else {\n        value.__tracker_identity = this._symbolProvider.next();\n        this._identities.set(value, value.__tracker_identity);\n      }\n    }\n    \n   \n    // Check and store object type\n    let type = typeof(value);\n    if(value && value.constructor && value.constructor.name) {\n      type = value.constructor.name;\n    }\n    \n    if(value && value.constructor && value.constructor.prototype) {\n      prototype = value.constructor.prototype;\n    }\n\n    \n    // Copy the value\n    if(value instanceof CanvasRenderingContext2D) {\n      value = value.getImageData(0, 0, value.canvas.width, value.canvas.height);\n    } else if (value instanceof Object) {\n      value = deepCopy(value);\n    } else {\n      // don't copy values since they are unmutable\n    }\n    \n    if(value instanceof Object) {\n      value.__tracker_time = Date.now() \n    }\n    \n   \n    this.ids.get(id)\n            .get(exampleId)\n            .get(runId)[keyword] = {\n              type: type,\n              value: value,\n              prototype: prototype,\n              name: name\n            };\n    \n    return originalValue;\n  }\n  \n  block(id) {\n    this.executedBlocks.add(id);\n  }\n  \n  iteration(id) {\n    const iterationMap = this.iterations.get(id);\n    const iterationCount = iterationMap.get(this.exampleId);\n    iterationMap.set(this.exampleId, iterationCount + 1);\n    return iterationCount;\n  }\n  \n  error(errorMsg) {\n    this.errors.set(this.exampleId, errorMsg);\n  }\n  \n  get exampleId() {\n    return Zone.current.babylonianExampleId\n  }\n  \n  set exampleId(id) {\n    // throw new Error(\"exampleId should not be set\")\n  }\n  \n  example(exampleId) {\n    // this.exampleId = exampleId; // for async examples this is not enough... Zone.current.babylonianExampleId\n    this.exampleIds.add(this.exampleId);\n  }\n}\n\n\nexport class IdentitySymbolProvider {\n  constructor() {\n    this._identitySymbols =  ['🐶','🐺','🐱','🐭','🐹','🐰','🐸','🐯','🐨','🐻','🐷','🐽','🐮','🐗','🐵','🐒','🐴','🐑','🐘','🐼','🐧','🐦','🐤','🐥','🐣','🐔','🐍','🐢','🐛','🐝','🐜','🐞','🐌','🐙','🐚','🐠','🐟','����','🐳','🐋','🐄','🐏','🐀','🐃','🐅','🐇','🐉','🐎','🐐','🐓','🐕','🐖','🐁','🐂','🐲','🐡','🐊'];\n    this._index = 0;\n  }\n  \n  next() {\n    return this._identitySymbols[this._index++ % this._identitySymbols.length];\n  }\n  \n  reset() {\n    this._index = 0;\n  }\n}\n\nexport class Timer {\n  \n  static get MaxRuntime() {\n     return 2000\n  }\n  \n  constructor() {\n    this._maxRuntime = Timer.MaxRuntime;\n    this._startTime = null;\n  }\n  \n  start() {\n    this._startTime = (+new Date());\n  }\n  \n  reset() {\n    this._startTime = null;\n  }\n  \n  check() {\n    if(this._startTime === null) {\n      return;\n    }\n    \n    const time = Date.now();\n    if(time - this._startTime > this._maxRuntime) {\n      throw new Error(\"Timeout reached. Maybe there is an inifinite loop?\");\n    }\n  }\n}\n"]}