{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/client/reactive/reactive-jsx/ui-aexpr.js"],"names":["PausableLoop","REMOVE_LISTENER_BY_CHECK_FUNCTION","Map","removeObsoleteListeners","Array","from","forEach","nodeDetachedFromDOM","removeListener","delete","size","pause","toDOMNode","builder","x","currentNode","getCurrentValue","updateDOMNode","val","newNode","replaceWith","getRootNode","composed","document","offChange","onChange","set","ensureRunning","removeLoop","__unload__"],"mappings":";;;;;;AAASA,kB,UAAAA,Y;;;;;;;;;;AAET,YAAMC,oCAAoC,IAAIC,GAAJ,EAA1C,C,CAAqD;;;AAErD,eAASC,uBAAT,GAAmC;AACjCC,cAAMC,IAAN,0DAAWJ,iCAAX,EAA8CK,OAA9C,CAAsD,CAAC,CAACC,mBAAD,EAAsBC,cAAtB,CAAD,KAA2C;AAC/F,cAAGD,qBAAH,EAA0B;AACxBC;AACA,uGAAkCC,MAAlC,CAAyCF,mBAAzC;AACD;AACF,SALD;AAMA,YAAG,2FAAkCG,IAAlC,KAA2C,CAA9C,EAAiD;AAC/C,8EAAWC,KAAX;AACD;AACF;;AAED;AACO,eAASC,SAAT,CAAmBC,UAAUC,KAAKA,CAAlC,EAAqC;AAC1C,YAAIC,cAAcF,QAAQ,KAAKG,eAAL,EAAR,CAAlB;;AAEA,iBAASC,aAAT,CAAuBC,GAAvB,EAA4B;AAC1B;AACA,gBAAMC,UAAUN,QAAQK,GAAR,CAAhB;AACAH,sBAAYK,WAAZ,CAAwBD,OAAxB;AACAJ,wBAAcI,OAAd;AACD;;AAED,iBAASZ,mBAAT,GAA+B;AAC7B,iBAAOQ,YAAYM,WAAZ,CAAwB,EAACC,UAAS,IAAV,EAAxB,MAA6CC,QAApD;AACD;;AAED,cAAMf,iBAAiB,MAAM,KAAKgB,SAAL,CAAeP,aAAf,CAA7B;;AAEA,aAAKQ,QAAL,CAAcR,aAAd;;AAEA,mGAAkCS,GAAlC,CAAsCnB,mBAAtC,EAA2DC,cAA3D;AACA,4EAAWmB,aAAX;;AAEA,eAAOZ,WAAP;AACD;;;;AAED,YAAMa,aAAa,6DAAI5B,YAAJ,0DAAiBG,uBAAjB,CAAnB;;;AAEO,eAAS0B,UAAT,GAAsB;AAC3B,4EAAWlB,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  let currentNode = builder(this.getCurrentValue());\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}\n"]}