{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-function-completion/src/babylonian-programming-editor/worker/babylonian-worker.js"],"names":["boundEval","workspaces","ASTWorkerPromiseWrapper","generateLocationMap","defaultConnections","defaultExample","Tracker","Performance","BabylonianWorker","constructor","_editors","Set","_astWorker","tracker","activeExamples","registerEditor","editor","has","add","unregisterEditor","delete","updateEditors","onTrackerChanged","evaluateEditor","execute","serializedAnnotations","key","annotations","map","a","serializeForWorker","examples","context","step","ast","loadableCode","executableCode","process","value","customInstances","i","url","_getReplacementUrls","hadParseError","loadableWorkspace","reset","loadResult","_load","connections","isError","path","someEditor","length","forEach","e","console","log","evalResult","hadEvalError","lastEvalError","originalErr","message","stop","code","thisReference","workspaceName","lively","unloadModule","self","__pluginDoitThisRefs__","__topLevelVarRecorder_ModuleNames__","setCode","System","import","then","m","__result__","err","Promise","resolve","replacementUrls","Array","from","reduce","acc"],"mappings":"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","file":"babylonian-worker.js","sourcesContent":["import boundEval from 'src/client/bound-eval.js';\nimport  * as workspaces from 'src/client/workspaces.js';\n\nimport ASTWorkerPromiseWrapper from \"./ast-worker-promise-wrapper.js\";\nimport {\n  generateLocationMap\n} from \"../utils/ast.js\";\nimport {\n  defaultConnections,\n  defaultExample\n} from \"../utils/defaults.js\";\nimport Tracker from \"../utils/tracker.js\";\nimport Performance from \"../utils/performance.js\";\n\n\n/**\n * The global Babylonian Worker\n */\nclass BabylonianWorker {\n  constructor() {\n    // List of all active editors\n    this._editors = new Set();\n    \n    // Worker for parsing\n    this._astWorker = new ASTWorkerPromiseWrapper();\n    \n    // Tracker\n    this.tracker = new Tracker();\n    \n    // Currently active examples\n    this.activeExamples = new Set([defaultExample()]);\n  }\n  \n  /**\n   * Managing editors\n   */\n  \n  registerEditor(editor) {\n    if(!this._editors.has(editor)) {\n      this._editors.add(editor);\n    }\n  }\n  \n  unregisterEditor(editor) {\n    this._editors.delete(editor);\n  }\n  \n  updateEditors() {\n    for(let editor of this._editors) {\n      editor.onTrackerChanged();\n    }\n  }\n  \n  /**\n   * Evaluating\n   */\n  async evaluateEditor(editor, execute = true) {\n    // Serialize annotations\n    let serializedAnnotations = {};\n    for(let key of [\"probes\", \"sliders\", \"replacements\", \"instances\"]) {\n      serializedAnnotations[key] = editor.annotations[key].map((a) => a.serializeForWorker());\n    }\n    serializedAnnotations.examples = editor.activeExamples.map((a) => a.serializeForWorker());\n\n    // Serialize context\n    serializedAnnotations.context = editor.context;\n    \n    // Performance\n    Performance.step(\"parse_and_transform\");\n\n    // Generate AST and modified code\n    const { ast, loadableCode, executableCode } = await this._astWorker.process(\n      editor.value,\n      serializedAnnotations,\n      editor.customInstances.map(i => i.serializeForWorker()),\n      editor.url,\n      this._getReplacementUrls()\n    );\n    if(!ast) {\n      editor.hadParseError = true;\n      editor.loadableWorkspace = null;\n    } else {\n      editor.hadParseError = false;\n      generateLocationMap(ast);\n      editor.ast = ast;\n      editor.loadableCode = loadableCode;\n      editor.executableCode = executableCode;\n      \n      if(!execute) {\n        return;\n      }\n      \n      // Performance\n      Performance.step(\"execute\");\n      \n      // Reset the tracker to write new results\n      this.tracker.reset();\n      \n      // Load the loadable version of the module\n      const loadResult = await this._load(editor.loadableCode, editor.url, {\n        tracker: this.tracker,\n        connections: defaultConnections(),\n      });\n      if(loadResult.isError) {\n        editor.loadableWorkspace = null;\n      } else {\n        editor.loadableWorkspace = loadResult.path;\n      }\n\n      // Execute all modules that have active examples\n      this.activeExamples = new Set([defaultExample()]);\n      for(let someEditor of this._editors) {\n        if(!someEditor.activeExamples.length) {\n          continue;\n        }\n        someEditor.activeExamples.forEach(e => this.activeExamples.add(e));\n\n        console.log(`BAB execute module with example: ${someEditor.url}`);\n        const evalResult = await boundEval(someEditor.executableCode, {\n          tracker: this.tracker,\n          connections: defaultConnections(),\n        });\n        someEditor.hadEvalError = evalResult.isError;\n        if(someEditor.hadEvalError) {\n          someEditor.lastEvalError = evalResult.value.originalErr.message;\n        }\n      }\n    }\n    \n    // Performance\n    Performance.step(\"update\");\n  \n    // Tell editors that the tracker has changed\n    this.updateEditors();\n    \n    // Performance\n    Performance.stop();\n  }\n  \n  async _load(code, url, thisReference) {\n    // Based on boundEval() \n    const workspaceName = `${url}.babylonian`;\n    const path = `workspacejs:${workspaceName}`;\n    \n    // Unload old version if there is one\n    lively.unloadModule(path);\n\n    // 'this' reference\n    if (!self.__pluginDoitThisRefs__) {\n      self.__pluginDoitThisRefs__ = {};\n    } \n    \n    self.__pluginDoitThisRefs__[workspaceName] = thisReference;\n    \n    \n    if (!self.__topLevelVarRecorder_ModuleNames__) {\n      self.__topLevelVarRecorder_ModuleNames__ = {};\n    } \n    self.__topLevelVarRecorder_ModuleNames__[path] = workspaceName;\n    \n    try {\n      workspaces.setCode(path, code);\n\n      return await System.import(path)\n        .then(m => {\n          return ({\n            value: m.__result__,\n            path: path\n          })});\n    } catch(err) {\n      console.log(\"BAB _load error\", err)\n      return Promise.resolve({\n        value: err,\n        isError: true\n      });\n    }\n  }\n  \n  _getReplacementUrls() {\n    const replacementUrls = Array.from(this._editors).reduce((acc, editor) => {\n      if(editor.loadableWorkspace) {\n        acc[editor.url] = editor.loadableWorkspace;\n      }\n      return acc;\n    }, {})\n    return replacementUrls;\n  }\n}\n\n\n// Only export as Singleton\nexport default new BabylonianWorker();"]}