{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-leo/src/client/reactive/reactive-jsx/ui-aexpr.js"],"names":["PausableLoop","REMOVE_LISTENER_BY_CHECK_FUNCTION","Map","removeObsoleteListeners","Array","from","forEach","nodeDetachedFromDOM","removeListener","delete","size","removeLoop","pause","toDOMNode","builder","x","value","evaluateToCurrentValue","currentNode","updateDOMNode","val","newNode","replaceWith","getRootNode","composed","document","offChange","onChange","set","ensureRunning","__unload__"],"mappings":";;;;;;AAASA,kB,UAAAA,Y;;;;AAET,YAAMC,oCAAoC,IAAIC,GAAJ,EAA1C,C,CAAqD;;AAErD,eAASC,uBAAT,GAAmC;AACjCC,cAAMC,IAAN,CAAWJ,iCAAX,EAA8CK,OAA9C,CAAsD,CAAC,CAACC,mBAAD,EAAsBC,cAAtB,CAAD,KAA2C;AAC/F,cAAID,qBAAJ,EAA2B;AACzBC;AACAP,8CAAkCQ,MAAlC,CAAyCF,mBAAzC;AACD;AACF,SALD;AAMA,YAAIN,kCAAkCS,IAAlC,KAA2C,CAA/C,EAAkD;AAChDC,qBAAWC,KAAX;AACD;AACF;;AAED;AACO,eAASC,SAAT,CAAmBC,UAAUC,KAAKA,CAAlC,EAAqC;AAC1C,cAAM,EAAEC,KAAF,KAAY,KAAKC,sBAAL,EAAlB;AACA,YAAIC,cAAcJ,QAAQE,KAAR,CAAlB;;AAEA,iBAASG,aAAT,CAAuBC,GAAvB,EAA4B;AAC1B;AACA,gBAAMC,UAAUP,QAAQM,GAAR,CAAhB;AACAF,sBAAYI,WAAZ,CAAwBD,OAAxB;AACAH,wBAAcG,OAAd;AACD;;AAED,iBAASd,mBAAT,GAA+B;AAC7B,iBAAOW,YAAYK,WAAZ,CAAwB,EAAEC,UAAU,IAAZ,EAAxB,MAAgDC,QAAvD;AACD;;AAED,cAAMjB,iBAAiB,MAAM,KAAKkB,SAAL,CAAeP,aAAf,CAA7B;;AAEA,aAAKQ,QAAL,CAAcR,aAAd;;AAEAlB,0CAAkC2B,GAAlC,CAAsCrB,mBAAtC,EAA2DC,cAA3D;AACAG,mBAAWkB,aAAX;;AAEA,eAAOX,WAAP;AACD;;;;AAED,YAAMP,aAAa,IAAIX,YAAJ,CAAiBG,uBAAjB,CAAnB;;AAEO,eAAS2B,UAAT,GAAsB;AAC3BnB,mBAAWC,KAAX;AACA;AACA;AACD","file":"ui-aexpr.js","sourcesContent":["import { PausableLoop } from 'utils';\n\nconst REMOVE_LISTENER_BY_CHECK_FUNCTION = new Map(); // nodeDetachedFromDOM -> removeListener\n\nfunction removeObsoleteListeners() {\n  Array.from(REMOVE_LISTENER_BY_CHECK_FUNCTION).forEach(([nodeDetachedFromDOM, removeListener]) => {\n    if (nodeDetachedFromDOM()) {\n      removeListener();\n      REMOVE_LISTENER_BY_CHECK_FUNCTION.delete(nodeDetachedFromDOM);\n    }\n  });\n  if (REMOVE_LISTENER_BY_CHECK_FUNCTION.size === 0) {\n    removeLoop.pause();\n  }\n}\n\n// `this` is an ActiveExpression \nexport function toDOMNode(builder = x => x) {\n  const { value } = this.evaluateToCurrentValue();\n  let currentNode = builder(value);\n\n  function updateDOMNode(val) {\n    // lively.notify(\"change aexpr result\", val)\n    const newNode = builder(val);\n    currentNode.replaceWith(newNode);\n    currentNode = newNode;\n  };\n\n  function nodeDetachedFromDOM() {\n    return currentNode.getRootNode({ composed: true }) !== document;\n  }\n\n  const removeListener = () => this.offChange(updateDOMNode);\n\n  this.onChange(updateDOMNode);\n\n  REMOVE_LISTENER_BY_CHECK_FUNCTION.set(nodeDetachedFromDOM, removeListener);\n  removeLoop.ensureRunning();\n\n  return currentNode;\n}\n\nconst removeLoop = new PausableLoop(removeObsoleteListeners);\n\nexport function __unload__() {\n  removeLoop.pause();\n  //cancelAnimationFrame(checkRequest);\n  // lively.notify(\"unload module\", \"UI AEXPR\", undefined, null, \"red\");\n}"]}