{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/client/reactive/active-expression-proxies/active-expression-proxies.js"],"names":["BaseActiveExpression","self","__expressionAnalysisMode__","__currentActiveExpression__","__proxyToTargetMap__","WeakMap","__proxyIdToActiveExpressionsMap__","Map","reset","clear","basicHandlerFactory","id","get","target","property","dependencies","add","set","Reflect","bind","value","has","Set","forEach","dependentActiveExpression","notifyOfUpdate","deleteProperty","functionHandlerFactory","apply","thisArg","argumentsList","result","unwrap","proxy","wrap","typeOfWhat","what","size","basicHandler","functionHandler","methods","Object","getOwnPropertyNames","eval","prototype","filter","propName","method","Proxy","aexpr","func","arg","ProxiesActiveExpression","constructor","args","checkAndNotify"],"mappings":"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","file":"active-expression-proxies.js","sourcesContent":["import { BaseActiveExpression } from 'active-expression';\n\nself.__expressionAnalysisMode__ = false;\n\n// #TODO: should be a stack for nested aexprs\n// #TODO: maybe we should provide a global stack across all implementations\nself.__currentActiveExpression__ = false;\n\n// maps from proxy to target\nself.__proxyToTargetMap__ = new WeakMap();\n\n// maps from target ids to active expressions\n// #TODO: should use a MultiMap\nself.__proxyIdToActiveExpressionsMap__ = new Map();\n\nexport function reset() {\n  self.__proxyIdToActiveExpressionsMap__.clear();\n  self.__proxyIdToActiveExpressionsMap__ = new Map();\n}\n\nconst basicHandlerFactory = id => ({\n  get: (target, property) => {\n    if (self.__expressionAnalysisMode__) {\n      let dependencies = self.__proxyIdToActiveExpressionsMap__.get(id);\n      dependencies.add(self.__currentActiveExpression__);\n      self.__proxyIdToActiveExpressionsMap__.set(id, dependencies);\n    }\n    if (typeof target[property] === 'function') {\n      return Reflect.get(target, property).bind(target);\n    }\n    return Reflect.get(target, property);\n  },\n\n  set: (target, property, value) => {\n    Reflect.set(target, property, value);\n\n    if (!self.__proxyIdToActiveExpressionsMap__.has(id)){\n      self.__proxyIdToActiveExpressionsMap__.set(id, new Set());\n    }\n    \n    self.__proxyIdToActiveExpressionsMap__\n      .get(id)\n      .forEach(dependentActiveExpression =>\n        dependentActiveExpression.notifyOfUpdate()\n      );\n    return true;\n  },\n  \n  deleteProperty(target, property) {\n    if (property in target) {\n      delete target[property];\n      if (!self.__proxyIdToActiveExpressionsMap__.has(id)){\n        self.__proxyIdToActiveExpressionsMap__.set(id, {});\n      }\n\n      self.__proxyIdToActiveExpressionsMap__\n        .get(id)\n        .forEach(dependentActiveExpression =>\n          dependentActiveExpression.notifyOfUpdate()\n      );\n      \n      return true\n    }\n    return false\n  }\n});\n\nconst functionHandlerFactory = id => ({\n  apply: (target, thisArg, argumentsList) => {\n    thisArg = self.__proxyToTargetMap__.get(thisArg) || thisArg;\n\n    if (self.__expressionAnalysisMode__) {\n      return target.bind(thisArg)(...argumentsList);\n    }\n    const result = target.bind(thisArg)(...argumentsList);\n    self.__proxyIdToActiveExpressionsMap__\n      .get(id)\n      .forEach(dependentActiveExpression =>\n        dependentActiveExpression.notifyOfUpdate()\n      );\n    return result;\n  },\n});\n\nexport function unwrap(proxy) {\n  return self.__proxyToTargetMap__.get(proxy) || proxy;\n}\n\nexport function wrap(typeOfWhat, what) {\n  if (self.__proxyToTargetMap__.has(what)) return what;\n  const id = self.__proxyIdToActiveExpressionsMap__.size;\n  const basicHandler = basicHandlerFactory(id);\n\n  if (typeOfWhat !== 'Object'){\n    const functionHandler = functionHandlerFactory(id);\n    const methods = Object.getOwnPropertyNames(eval(typeOfWhat).prototype).filter(\n      propName => typeof what[propName] === 'function'\n    );\n    methods.forEach(\n      method => (what[method] = new Proxy(what[method], functionHandler))\n    );\n  }\n\n  self.__proxyIdToActiveExpressionsMap__.set(id, new Set());\n  const proxy = new Proxy(what, basicHandler);\n  self.__proxyToTargetMap__.set(proxy, what);\n\n  return proxy;\n}\n\n// #TODO: should be a default export\nexport function aexpr(func, ...arg) {\n  return new ProxiesActiveExpression(func, ...arg);\n}\n\nexport class ProxiesActiveExpression extends BaseActiveExpression {\n  constructor(func, ...args) {\n    super(func, ...args);\n    this.notifyOfUpdate();\n  }\n\n  notifyOfUpdate() {\n    self.__expressionAnalysisMode__ = true;\n    self.__currentActiveExpression__ = this;\n\n    this.func();\n    this.checkAndNotify();\n\n    self.__expressionAnalysisMode__ = false;\n  }\n}\n"]}