{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-function-completion/src/babylonian-programming-editor/utils/tracker.js"],"names":["defaultExample","deepCopy","DefaultMap","Tracker","constructor","ids","builder","Object","idIterationParents","iterations","errors","Map","executedBlocks","Set","exampleId","id","exampleIds","add","timer","Timer","_identities","_symbolProvider","IdentitySymbolProvider","reset","clear","iterationParentId","runId","value","name","keyword","includes","set","has","__tracker_identity","get","next","type","CanvasRenderingContext2D","getImageData","canvas","width","height","block","iteration","iterationMap","iterationCount","error","errorMsg","example","_identitySymbols","_index","length","_maxRuntime","_startTime","start","Date","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    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    // Copy the value\n    if(value instanceof CanvasRenderingContext2D) {\n      value = value.getImageData(0, 0, value.canvas.width, value.canvas.height);\n    } else {\n      value = deepCopy(value);\n    }\n   \n    this.ids.get(id)\n            .get(exampleId)\n            .get(runId)[keyword] = {\n              type: type,\n              value: value,\n              name: name\n            };\n    \n    return value;\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  example(exampleId) {\n    this.exampleId = exampleId;\n    this.exampleIds.add(this.exampleId);\n  }\n}\n\n\nclass 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\n\nclass Timer {\n  constructor() {\n    this._maxRuntime = 1000;\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 = (+new Date());\n    if(time - this._startTime > this._maxRuntime) {\n      throw new Error(\"Timeout reached. Maybe there is an inifinite loop?\");\n    }\n  }\n}\n"]}