{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-petrinet/src/client/reactive/active-expression-convention/active-expression-frame-based.js"],"names":["BaseActiveExpression","check","PausableLoop","FrameBasedActiveExpression","constructor","func","args","meta","strategy","enabled","new","target","addToRegistry","onChange","_isDisposed","FRAME_BASED_AEXPRS","add","checkLoop","ensureRunning","offChange","hasCallbacks","revoke","dispose","delete","size","pause","aexpr","Set","__unload__"],"mappings":";;;;;;AAASA,0B,qBAAAA,oB;;AACAC,W,yEAAAA,K;;AACAC,kB,UAAAA,Y;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,YAAMC,0BAAN,SAAyCH,oBAAzC,CAA8D;AACnEI,oBAAYC,IAAZ,EAAkB,GAAGC,IAArB,EAA2B;AACzB,gBAAMD,IAAN,EAAY,GAAGC,IAAf;AACA,eAAKC,IAAL,CAAU,EAAEC,UAAU,aAAZ,EAAV;;AAEA;AACA,eAAKC,OAAL,GAAe,IAAf;;AAEA,cAAGC,IAAIC,MAAJ,KAAeR,0BAAlB,EAA8C;AAC5C,iBAAKS,aAAL;AACD;AACF;;AAEDC,iBAAS,GAAGP,IAAZ,EAAkB;AAChB,gBAAMO,QAAN,CAAe,GAAGP,IAAlB;;AAEA,cAAG,CAAC,KAAKQ,WAAT,EAAsB;AACpBC,+BAAmBC,GAAnB,CAAuB,IAAvB;AACAC,sBAAUC,aAAV;AACD;AACF;;AAEDC,kBAAU,GAAGb,IAAb,EAAmB;AACjB,gBAAMa,SAAN,CAAgB,GAAGb,IAAnB;;AAEA,cAAG,CAAC,KAAKc,YAAL,EAAJ,EAAyB;AACvB,iBAAKC,MAAL;AACD;AACF;;AAEDC,kBAAU;AACR,gBAAMA,OAAN;AACA,eAAKD,MAAL;AACD;;AAED;AACAA,iBAAS;AACPN,6BAAmBQ,MAAnB,CAA0B,IAA1B;AACA,cAAGR,mBAAmBS,IAAnB,KAA4B,CAA/B,EAAkC;AAChCP,sBAAUQ,KAAV;AACD;AACF;AAzCkE;;;;;;;;;;;;;;;;;;AA4C9D,eAASC,KAAT,CAAerB,IAAf,EAAqB,GAAGC,IAAxB,EAA8B;AACnC,eAAO,IAAIH,0BAAJ,CAA+BE,IAA/B,EAAqC,GAAGC,IAAxC,CAAP;AACD;;;;AAED,YAAMS,qBAAqB,IAAIY,GAAJ,EAA3B;;AAEA;;;;;;;;;;;;;;AACA,YAAMV,YAAY,IAAIf,YAAJ,CAAiB,MAAMD,MAAMc,kBAAN,CAAvB,CAAlB;;;;;;;;;;;;;;;AAEO,eAASa,UAAT,GAAsB;AAC3BX,kBAAUQ,KAAV;AACD","file":"active-expression-frame-based.js","sourcesContent":["import { BaseActiveExpression } from 'active-expression';\nimport { check } from \"src/client/reactive/active-expression-convention/active-expression-ticking.js\";\nimport { PausableLoop } from 'utils';\n\nexport class FrameBasedActiveExpression extends BaseActiveExpression {\n  constructor(func, ...args) {\n    super(func, ...args);\n    this.meta({ strategy: 'Frame-based' });\n\n    // needed for check function for aexpr-ticking\n    this.enabled = true;\n\n    if(new.target === FrameBasedActiveExpression) {\n      this.addToRegistry();\n    }\n  }\n\n  onChange(...args) {\n    super.onChange(...args);\n\n    if(!this._isDisposed) {\n      FRAME_BASED_AEXPRS.add(this);\n      checkLoop.ensureRunning();\n    }\n  }\n\n  offChange(...args) {\n    super.offChange(...args);\n\n    if(!this.hasCallbacks()) {\n      this.revoke();\n    }\n  }\n\n  dispose() {\n    super.dispose();\n    this.revoke();\n  }\n\n  // #TODO: unused!\n  revoke() {\n    FRAME_BASED_AEXPRS.delete(this);\n    if(FRAME_BASED_AEXPRS.size === 0) {\n      checkLoop.pause();\n    }\n  }\n}\n\nexport function aexpr(func, ...args) {\n  return new FrameBasedActiveExpression(func, ...args);\n}\n\nconst FRAME_BASED_AEXPRS = new Set();\n\n// update Active Expressions once per frame\nconst checkLoop = new PausableLoop(() => check(FRAME_BASED_AEXPRS));\n\nexport function __unload__() {\n  checkLoop.pause();\n}\n"]}