{"version":3,"file":"hookuspocus.mjs","sources":["../src/core.js","../src/use_reducer.js","../src/on.js","../src/use_layout_effect.js","../src/use_effect.js","../src/use_state.js","../src/wrap_function.js"],"sourcesContent":["const runMap = window.___hookusPocusRunMap || new (WeakMap || Map)();\nwindow.___hookusPocusRunMap = runMap;\n\nconst hookDataStack = runMap.h || [];\nrunMap.h = hookDataStack;\n\nexport const dataMap = runMap.d || new (WeakMap || Map)();\nrunMap.d = dataMap;\nexport const hookus = hookFunction => {\n  return function hook() {\n    const context = hookDataStack[runMap.stackIndex][0];\n    runMap.hookIndex++;\n    const data =\n      hookDataStack[runMap.stackIndex][runMap.hookIndex] ||\n      (hookDataStack[runMap.stackIndex][runMap.hookIndex] = [\n        { context, hook: hookFunction }\n      ]);\n    return (dataMap.get(hook) || hookFunction).apply(\n      {},\n      data.concat(Array.from(arguments))\n    );\n  };\n};\nconst runLifeCycles = (context, name) => {\n  const promises = hookDataStack[runMap.stackIndex]\n    .map(data => {\n      if (data[0] && data[0][name]) {\n        const result = data[0][name]();\n        data[0][name] = 0;\n        return result;\n      }\n    })\n    .filter(result => result instanceof Promise);\n  if (promises.length > 0) {\n    const promiseAll = Promise.all(promises);\n    runMap.set(\n      context,\n      runMap.has(context) ? runMap.get(context).then(promiseAll) : promiseAll\n    );\n  }\n};\nconst waitForContext = (context, cb) => {\n  if (runMap.has(context)) {\n    const promise = runMap.get(context).then(cb);\n    runMap.set(context, promise);\n    return promise;\n  } else {\n    return cb();\n  }\n};\nconst run = (context, cleanUp, func, args) => {\n  if (cleanUp === true) {\n    runMap.set(context, runLifeCycles(context, \"cleanUp\"));\n    dataMap.delete(context);\n  } else {\n    return waitForContext(context, () => {\n      runMap.hookIndex = 0;\n      runMap.stackIndex =\n        hookDataStack.push(dataMap.get(context) || [context]) - 1;\n      dataMap.set(context, hookDataStack[runMap.stackIndex]);\n      runLifeCycles(context, \"before\");\n      return waitForContext(context, () => {\n        let result = func.apply(func, args);\n        runLifeCycles(context, \"after\");\n        return waitForContext(context, () => {\n          hookDataStack.pop();\n          runMap.delete(context);\n          return result;\n        });\n      });\n    });\n  }\n};\nexport const pocus = function() {\n  const args = Array.from(arguments);\n  let funcArgs;\n  if (args[0][\"pop\"]) {\n    funcArgs = args.shift();\n  }\n  const context = typeof args[1] === \"boolean\" ? args[0] : args[1] || args[0];\n  const cleanUp = args[1] === true || args[2];\n  return run(context, cleanUp, args[0], funcArgs);\n};\n","import { hookus } from \"./core\";\n\nexport const useReducer = hookus((data, reducer, initialArg, init) => {\n  data.s = data.s !== undefined ? data.s : init ? init(initialArg) : initialArg;\n  return [\n    data.s,\n    action => {\n      data.s = reducer(data.s, action);\n      return data.s;\n    }\n  ];\n});\n","import { useReducer } from \"./use_reducer\";\nimport { dataMap } from \"./core\";\n\nexport const on = (hook, cb) => {\n  dataMap.set(hook, cb);\n};\nexport const onStateChanged = cb =>\n  on(useReducer, (data, reducer, initialArg, init) => {\n    const [state, dispatch] = data.hook(data, reducer, initialArg, init);\n    return [\n      state,\n      action => {\n        const result = dispatch(action);\n        if (state !== result) {\n          cb(data.context);\n        }\n        return result;\n      }\n    ];\n  });\n","import { hookus } from \"./core\";\nexport const useLayoutEffect = hookus((data, effect, values) => {\n  if (\n    !data.v ||\n    (values &&\n      !(\n        values.length === data.v.length &&\n        values.every(value => ~data.v.indexOf(value))\n      ))\n  ) {\n    data.v = values;\n    if (data.cleanUp) {\n      data.cleanUp();\n    }\n    data.after = () => {\n      let result = effect();\n      if (result instanceof Promise) {\n        result = result.then(cleanUp => (data.cleanUp = cleanUp));\n      } else {\n        data.cleanUp = result;\n      }\n      return result;\n    };\n  }\n});\n","import { useLayoutEffect } from \"./use_layout_effect\";\n\nexport const useEffect = (effect, values) => {\n  useLayoutEffect(\n    () => new Promise(resolve => requestAnimationFrame(_ => resolve(effect()))),\n    values\n  );\n};\n","import { useReducer } from \"./use_reducer\";\n\nexport const useState = initialState => {\n  const [state, dispatch] = useReducer(\n    (_, action) => action.value,\n    initialState\n  );\n  return [\n    state,\n    newState =>\n      dispatch({\n        value: newState\n      })\n  ];\n};\n","import { pocus } from \"./core\";\n\nexport const fidibus = (func, context) => {\n  const out = function() {\n    const args = Array.from(arguments);\n    if (args.length > 0) {\n      return pocus(args, func, context);\n    } else {\n      return pocus(func, context);\n    }\n  };\n  out.cleanUp = () => {\n    pocus(func, context, true);\n  };\n  return out;\n};\n"],"names":["const","runMap","window","___hookusPocusRunMap","WeakMap","Map","hookDataStack","h","dataMap","d","hookus","hookFunction","hook","context","stackIndex","hookIndex","data","get","apply","concat","Array","from","arguments","runLifeCycles","name","promises","map","result","filter","Promise","length","promiseAll","all","set","has","then","waitForContext","cb","promise","pocus","funcArgs","args","shift","cleanUp","func","push","pop","delete","run","useReducer","reducer","initialArg","init","s","undefined","action","on","onStateChanged","state","dispatch","useLayoutEffect","effect","values","v","every","value","indexOf","after","useEffect","resolve","requestAnimationFrame","_","useState","initialState","newState","fidibus","out"],"mappings":"AAAAA,IAAMC,EAASC,OAAOC,sBAAwB,IAAKC,SAAWC,KAC9DH,OAAOC,qBAAuBF,EAE9BD,IAAMM,EAAgBL,EAAOM,GAAK,GAClCN,EAAOM,EAAID,EAEJN,IAAMQ,EAAUP,EAAOQ,GAAK,IAAKL,SAAWC,KACnDJ,EAAOQ,EAAID,MACEE,WAASC,UACb,SAASC,QACRC,EAAUP,EAAcL,EAAOa,YAAY,GACjDb,EAAOc,gBACDC,EACJV,EAAcL,EAAOa,YAAYb,EAAOc,aACvCT,EAAcL,EAAOa,YAAYb,EAAOc,WAAa,CACpD,SAAEF,EAASD,KAAMD,YAEbH,EAAQS,IAAIL,IAASD,GAAcO,MACzC,GACAF,EAAKG,OAAOC,MAAMC,KAAKC,eAIvBC,WAAiBV,EAASW,OACxBC,EAAWnB,EAAcL,EAAOa,YACnCY,aAAIV,MACCA,EAAK,IAAMA,EAAK,GAAGQ,GAAO,KACtBG,EAASX,EAAK,GAAGQ,YACvBR,EAAK,GAAGQ,GAAQ,EACTG,KAGVC,gBAAOD,UAAUA,aAAkBE,aAClCJ,EAASK,OAAS,EAAG,KACjBC,EAAaF,QAAQG,IAAIP,GAC/BxB,EAAOgC,IACLpB,EACAZ,EAAOiC,IAAIrB,GAAWZ,EAAOgB,IAAIJ,GAASsB,KAAKJ,GAAcA,KAI7DK,WAAkBvB,EAASwB,MAC3BpC,EAAOiC,IAAIrB,GAAU,KACjByB,EAAUrC,EAAOgB,IAAIJ,GAASsB,KAAKE,UACzCpC,EAAOgC,IAAIpB,EAASyB,GACbA,SAEAD,KA0BEE,EAAQ,eAEfC,EADEC,EAAOrB,MAAMC,KAAKC,kBAEpBmB,EAAK,GAAL,MACFD,EAAWC,EAAKC,kBA3BP7B,EAAS8B,EAASC,EAAMH,OACnB,IAAZE,SAIKP,EAAevB,oBACpBZ,EAAOc,UAAY,EACnBd,EAAOa,WACLR,EAAcuC,KAAKrC,EAAQS,IAAIJ,IAAY,CAACA,IAAY,EAC1DL,EAAQyB,IAAIpB,EAASP,EAAcL,EAAOa,aAC1CS,EAAcV,EAAS,UAChBuB,EAAevB,iBAChBc,EAASiB,EAAK1B,MAAM0B,EAAMH,UAC9BlB,EAAcV,EAAS,SAChBuB,EAAevB,oBACpBP,EAAcwC,MACd7C,EAAO8C,OAAOlC,GACPc,QAfb1B,EAAOgC,IAAIpB,EAASU,EAAcV,EAAS,YAC3CL,EAAQuC,OAAOlC,GA4BVmC,CAF4B,kBAAZP,EAAK,GAAmBA,EAAK,GAAKA,EAAK,IAAMA,EAAK,IAC7C,IAAZA,EAAK,IAAeA,EAAK,GACZA,EAAK,GAAID,IC/E3BS,EAAavC,WAAQM,EAAMkC,EAASC,EAAYC,UAC3DpC,EAAKqC,OAAeC,IAAXtC,EAAKqC,EAAkBrC,EAAKqC,EAAID,EAAOA,EAAKD,GAAcA,EAC5D,CACLnC,EAAKqC,WACLE,UACEvC,EAAKqC,EAAIH,EAAQlC,EAAKqC,EAAGE,GAClBvC,EAAKqC,MCLLG,WAAM5C,EAAMyB,GACvB7B,EAAQyB,IAAIrB,EAAMyB,IAEPoB,WAAiBpB,UAC5BmB,EAAGP,WAAajC,EAAMkC,EAASC,EAAYC,SACfpC,EAAKJ,KAAKI,EAAMkC,EAASC,EAAYC,uBACxD,CACLM,WACAH,OACQ5B,EAASgC,EAASJ,UACpBG,IAAU/B,GACZU,EAAGrB,EAAKH,SAEHc,OCfFiC,EAAkBlD,WAAQM,EAAM6C,EAAQC,GAEhD9C,EAAK+C,KACLD,GAEGA,EAAOhC,SAAWd,EAAK+C,EAAEjC,QACzBgC,EAAOE,eAAMC,UAAUjD,EAAK+C,EAAEG,QAAQD,QAG1CjD,EAAK+C,EAAID,EACL9C,EAAK2B,SACP3B,EAAK2B,UAEP3B,EAAKmD,qBACCxC,EAASkC,WACTlC,aAAkBE,QACpBF,EAASA,EAAOQ,cAAKQ,UAAY3B,EAAK2B,QAAUA,IAEhD3B,EAAK2B,QAAUhB,EAEVA,MCnBAyC,WAAaP,EAAQC,GAChCF,oBACQ,IAAI/B,iBAAQwC,UAAWC,+BAAsBC,UAAKF,EAAQR,UAChEC,ICHSU,WAAWC,SACIxB,WACvBsB,EAAGhB,UAAWA,EAAOU,OACtBQ,gBAEK,eAELC,UACEf,EAAS,CACPM,MAAOS,OCTFC,WAAW/B,EAAM/B,OACtB+D,EAAM,eACJnC,EAAOrB,MAAMC,KAAKC,kBACpBmB,EAAKX,OAAS,EACTS,EAAME,EAAMG,EAAM/B,GAElB0B,EAAMK,EAAM/B,WAGvB+D,EAAIjC,mBACFJ,EAAMK,EAAM/B,GAAS,IAEhB+D"}