{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/client/reactive/active-expression/active-expression.js"],"names":["Annotations","CachingFetch","CachingPromise","shallowEqualsArray","shallowEqualsSet","shallowEqualsMap","shallowEquals","deepEquals","isString","clone","cloneDeep","HACK","window","__compareAExprResults__","isPromise","obj","then","AExprRegistry","_aexprs","Set","addAExpr","aexpr","add","removeAExpr","delete","allAsArray","Array","from","resolveValue","value","func","DefaultMatcher","compare","lastResult","newResult","isArray","Map","store","result","prototype","slice","call","IdentityMatcher","ShallowMatcher","DeepMatcher","MATCHER_MAP","BaseActiveExpression","constructor","params","match","cachingFetch","cachingPromise","currentValue","getCurrentValue","isAsync","setupMatcher","storeResult","callbacks","_isDisposed","_shouldDisposeOnLastCallbackDetached","_annotations","new","target","addToRegistry","trace","onChange","callback","push","offChange","index","indexOf","splice","length","dispose","checkAndNotify","compareResults","lastValue","notify","expr","matchConfig","has","Error","matcher","get","hasOwnProperty","args","forEach","applyOn","items","onBecomeTrue","bool","onBecomeFalse","nowAndOnChange","isDisposed","disposeOnLastCallbackDetached","name","meta","annotation","supportsDependencies"],"mappings":"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","file":"active-expression.js","sourcesContent":["import Annotations from '../utils/annotations.js';\nimport CachingFetch from '../utils/caching-fetch.js';\nimport CachingPromise from '../utils/caching-promise.js';\nimport { shallowEqualsArray, shallowEqualsSet, shallowEqualsMap, shallowEquals, deepEquals } from '../utils/equality.js';\nimport { isString, clone, cloneDeep } from 'utils';\n\n// TODO: this is use to keep SystemJS from messing up scoping\n// (BaseActiveExpression would not be defined in aexpr)\nconst HACK = {};\n\nwindow.__compareAExprResults__ = false;\n\nfunction isPromise(obj) {\n  return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';\n}\n\nexport const AExprRegistry = {\n\n  _aexprs: new Set(),\n\n  /**\n   * Handling membership\n   */\n  addAExpr(aexpr) {\n    this._aexprs.add(aexpr);\n  },\n  removeAExpr(aexpr) {\n    this._aexprs.delete(aexpr);\n  },\n\n  /**\n   * Access\n   */\n  allAsArray() {\n    return Array.from(this._aexprs);\n  }\n};\n\nfunction resolveValue(value, func) {\n  if(isPromise(value)) {\n    value.then(func);\n  } else {\n    func(value);\n  }\n}\n\nclass DefaultMatcher {\n  static compare(lastResult, newResult) {\n    // array\n    if(Array.isArray(lastResult) && Array.isArray(newResult)) {\n      return shallowEqualsArray(lastResult, newResult);\n    }\n    \n    // set\n    if(lastResult instanceof Set && newResult instanceof Set) {\n      return shallowEqualsSet(lastResult, newResult);\n    }\n\n    // map\n    if(lastResult instanceof Map && newResult instanceof Map) {\n      return shallowEqualsMap(lastResult, newResult);\n    }\n\n    return lastResult === newResult;\n  }\n  \n  static store(result) {\n    // array\n    if(Array.isArray(result)) {\n      return Array.prototype.slice.call(result);\n    }\n    \n    // set\n    if(result instanceof Set) {\n      return new Set(result);\n    }\n    \n    // map\n    if(result instanceof Map) {\n      return new Map(result);\n    }\n    \n    return result;\n  }\n}\n\nclass IdentityMatcher {\n  static compare(lastResult, newResult) {\n    return lastResult === newResult;\n  }\n  \n  static store(result) {\n    return result;\n  }\n}\n\nclass ShallowMatcher {\n  static compare(lastResult, newResult) {\n    // array\n    if(Array.isArray(lastResult) && Array.isArray(newResult)) {\n      return shallowEqualsArray(lastResult, newResult);\n    }\n    \n    // set\n    if(lastResult instanceof Set && newResult instanceof Set) {\n      return shallowEqualsSet(lastResult, newResult);\n    }\n\n    // map\n    if(lastResult instanceof Map && newResult instanceof Map) {\n      return shallowEqualsMap(lastResult, newResult);\n    }\n\n    return shallowEquals(lastResult, newResult) ;\n  }\n  \n  static store(result) {\n    return clone.call(result);\n  }\n}\n\nclass DeepMatcher {\n  static compare(lastResult, newResult) {\n    return deepEquals(lastResult, newResult);\n  }\n  \n  static store(result) {\n    return cloneDeep.call(result);\n  }\n}\n\nconst MATCHER_MAP = new Map([\n  ['default', DefaultMatcher],\n  ['identity', IdentityMatcher],\n  ['shallow', ShallowMatcher],\n  ['deep', DeepMatcher]\n])\n\nexport class BaseActiveExpression {\n\n  /**\n   *\n   * @param func (Function) the expression to be observed\n   * @param ...params (Objects) the instances bound as parameters to the expression\n   */\n  constructor(func, { params = [], match } = {}) {\n    this.func = func;\n    this.params = params;\n    this.cachingFetch = new CachingFetch();\n    this.cachingPromise = new CachingPromise(this.cachingFetch);\n    let currentValue = this.getCurrentValue();\n    if(isPromise(currentValue)) {\n      this.isAsync = true;\n    }\n    this.setupMatcher(match);\n    resolveValue(currentValue, (value) => {\n      this.storeResult(value);\n    })\n    this.callbacks = [];\n    this._isDisposed = false;\n    this._shouldDisposeOnLastCallbackDetached = false;\n\n    this._annotations = new Annotations();\n\n    if(new.target === BaseActiveExpression) {\n      this.addToRegistry();\n    }\n  }\n\n  addToRegistry() {\n    AExprRegistry.addAExpr(this);\n  }\n\n  /**\n   * Executes the encapsulated expression with the given parameters.\n   * aliases with 'now' (#TODO: caution, consider ambigous terminology: 'now' as in 'give me the value' or as in 'nowAndOnChange'?)\n   * @public\n   * @returns {*} the current value of the expression\n   */\n  getCurrentValue() {\n    return this.cachingFetch.trace(() => {\n      return this.cachingPromise.trace(() => {\n        return this.func(...this.params);\n      });\n    });\n  }\n\n  /**\n   * @public\n   * @param callback\n   * @returns {BaseActiveExpression} this very active expression (for chaining)\n   */\n  onChange(callback) {\n    this.callbacks.push(callback);\n\n    return this;\n  }\n  /**\n   * @public\n   * @param callback\n   * @returns {BaseActiveExpression} this very active expression (for chaining)\n   */\n  // #TODO: should this remove all occurences of the callback?\n  offChange(callback) {\n    var index = this.callbacks.indexOf(callback);\n    if (index > -1) {\n      this.callbacks.splice(index, 1);\n    }\n    if (this._shouldDisposeOnLastCallbackDetached && this.callbacks.length === 0) {\n      this.dispose();\n    }\n\n    return this;\n  }\n\n  /**\n   * Signals the active expression that a state change might have happened.\n   * Mainly for implementation strategies.\n   * @public\n   */\n  checkAndNotify() {\n    const currentValue = this.getCurrentValue();\n    resolveValue(currentValue, value => {\n      if(this.compareResults(this.lastValue, value)) { return; }\n      const lastValue = this.lastValue;\n      this.storeResult(value);\n\n      this.notify(value, {\n        lastValue,\n        expr: this.func ,\n        aexpr: this\n      });\n    });\n  }\n  \n  setupMatcher(matchConfig) {\n    // configure using existing matcher\n    if(matchConfig && isString.call(matchConfig)) {\n      if(!MATCHER_MAP.has(matchConfig)) {\n        throw new Error(`No matcher of type '${matchConfig}' registered.`)\n      }\n      this.matcher = MATCHER_MAP.get(matchConfig);\n      return;\n    }\n    \n    // configure using a custom matcher\n    if(typeof matchConfig === 'object') {\n      if(matchConfig.hasOwnProperty('compare') && matchConfig.hasOwnProperty('store')) {\n        this.matcher = matchConfig;\n        return;\n      }\n      throw new Error(`Given matcher object does not provide 'compare' and 'store' methods.`)\n    }\n    \n    // use smart default matcher\n    this.matcher = DefaultMatcher;\n  }\n\n  // #TODO: extract into CompareAndStore classes\n  compareResults(lastResult, newResult) {\n    try {\n      window.__compareAExprResults__ = true;\n      return this.matcher.compare(lastResult, newResult);\n    } finally {\n      window.__compareAExprResults__ = false;\n    }\n  }\n  \n  storeResult(result) {\n    try {\n      window.__compareAExprResults__ = true;\n      this.lastValue = this.matcher.store(result);\n    } finally {\n      window.__compareAExprResults__ = false;\n    }\n  }\n\n  notify(...args) {\n    this.callbacks.forEach(callback => callback(...args));\n  }\n\n  /**\n   * TODO\n   * like a bind for AExpr\n   * @param items\n   */\n  applyOn(...items) {\n    throw new Error('Not yet implemented');\n  }\n\n  onBecomeTrue(callback) {\n    // setup dependency\n    this.onChange(bool => {\n      if(bool) {\n        callback();\n      }\n    });\n    // check initial state\n    resolveValue(this.getCurrentValue(), value => {\n      if(value) { callback() }\n    });\n\n    return this;\n  }\n\n  onBecomeFalse(callback) {\n    // setup dependency\n    this.onChange(bool => {\n      if(!bool) {\n        callback();\n      }\n    });\n    // check initial state\n    resolveValue(this.getCurrentValue(), value => {\n      if(!value) { callback() }\n    });\n\n    return this;\n  }\n\n  nowAndOnChange(callback) {\n    // setup dependency\n    this.onChange(callback);\n\n    // call immediately\n    // #TODO: duplicated code: we should extract this call\n    resolveValue(this.getCurrentValue(), value => {\n      this.notify(value, {});\n    });\n\n    return this;\n  }\n\n  dispose() {\n    this._isDisposed = true;\n    AExprRegistry.removeAExpr(this);\n  }\n\n  isDisposed() {\n    return this._isDisposed;\n  }\n\n  /**\n   * #TODO: implement\n   * disposeOnLastCallbackDetached\n   * chainable\n   * for some auto-cleanup\n   * (only triggers, when a callback is detached; not initially, if there are no callbacks)\n   */\n  disposeOnLastCallbackDetached() {\n    this._shouldDisposeOnLastCallbackDetached = true;\n    return this;\n  }\n\n  /**\n   * Reflection information\n   */\n\n  name(...args) {\n    if(args.length > 0) {\n      this._annotations.add({ name: args[0] });\n      return this;\n    } else {\n      return this._annotations.get('name');\n    }\n  }\n\n  meta(annotation) {\n    if(annotation) {\n      this._annotations.add(annotation);\n      return this;\n    } else {\n      return this._annotations;\n    }\n  }\n\n  supportsDependencies() {\n    return false;\n  }\n}\n\nexport function aexpr(func, ...args) {\n  return new BaseActiveExpression(func, ...args);\n}\n\nexport default BaseActiveExpression;\n"]}