{"version":3,"sources":["../src/atomEnhancer.ts","../src/enhanceWith.ts","../src/utils.ts"],"sourcesContent":["import { atom } from \"jotai\";\nimport { Enhancer, enhanceWith } from \"./enhanceWith\";\nimport { AtomEnhancer, AtomEnhancerRead, AtomEnhancerWrite } from \"./types\";\n\nexport function atomEnhancer<\n  TLastState extends object,\n  TParameter extends object,\n  TResult extends object = object,\n>(\n  read: AtomEnhancerRead<TLastState, TResult>,\n  write?: AtomEnhancerWrite<TLastState, TParameter>,\n  fallbackEnhancer?: ReturnType<Enhancer<TLastState, TParameter, TResult>>,\n) {\n  type TLastEnhancer = Parameters<Enhancer<TLastState, TParameter, TResult>>[0];\n  const enhancer: AtomEnhancer<TLastState, TParameter, TResult> = {\n    read: ({ last }) => {\n      return atom((get) => read(get, { last }));\n    },\n    write: write\n      ? ({ stateHelper: { set, get, last }, update }) =>\n          write(get, set, update, { last })\n      : undefined,\n  };\n  return (last: TLastEnhancer) => enhanceWith(enhancer)(last, fallbackEnhancer);\n}\n","import { atom } from \"jotai\";\nimport { AtomEnhancer, ComposableAtom } from \"./types\";\nimport { isAtom } from \"./utils\";\n\nexport const enhanceWith =\n  <\n    TLastState extends object,\n    TParameterExtended extends object = never,\n    TResult extends object = never,\n  >({\n    read = () => ({}) as TResult,\n    write = () => Promise.resolve({ shouldAbortNextSetter: false }),\n  }: AtomEnhancer<TLastState, TParameterExtended, TResult>) =>\n  <TState extends TLastState, TParameter extends object = never>(\n    lastAtom?: ComposableAtom<TState, TParameter>,\n    fallbackAtom?: ComposableAtom<any, TParameter>,\n  ) => {\n    const newAtom = atom(\n      (get) => {\n        const last = lastAtom ? get(lastAtom) : ({} as TLastState & TState);\n\n        const possibleAtom = read({\n          last,\n        });\n        let notAtom;\n        if (isAtom(possibleAtom)) {\n          notAtom = get(possibleAtom);\n        } else {\n          notAtom = possibleAtom;\n        }\n        return {\n          ...last,\n          ...notAtom,\n        };\n      },\n      async (get, set, update: TParameterExtended | TParameter) => {\n        const last = lastAtom ? get(lastAtom) : ({} as TLastState & TState);\n        const { shouldAbortNextSetter } =\n          (await write({\n            stateHelper: {\n              last,\n              get,\n              set,\n            },\n            update: update as TParameterExtended,\n          })) || {};\n        if (!shouldAbortNextSetter) {\n          if (lastAtom) {\n            return set(lastAtom, update as TParameter);\n          }\n        } else {\n          if (fallbackAtom) {\n            return set(fallbackAtom, update as TParameter);\n          }\n        }\n        return { shouldAbortNextSetter };\n      },\n    );\n    return newAtom;\n  };\n\nexport type Enhancer<\n  TLastState extends object = object,\n  TParameterExtended extends object = object,\n  TResult extends object = object,\n> = ReturnType<typeof enhanceWith<TLastState, TParameterExtended, TResult>>;\n","import { Atom, atom } from \"jotai\";\n\nexport const ignoreSetterAtom = <T extends object>(a: Atom<T>) =>\n  atom(\n    (get) => get(a),\n    () => {},\n  );\n\nexport function isAtom<T>(value: unknown): value is Atom<T> {\n  return typeof value === \"object\" && value !== null && \"read\" in value;\n}\n"],"mappings":"AAAA,OAAS,QAAAA,MAAY,QCArB,OAAS,QAAAC,MAAY,QCArB,OAAe,QAAAC,MAAY,QAQpB,SAASC,EAAUC,EAAkC,CAC1D,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,SAAUA,CAClE,CDNO,IAAMC,EACX,CAIE,CACA,KAAAC,EAAO,KAAO,CAAC,GACf,MAAAC,EAAQ,IAAM,QAAQ,QAAQ,CAAE,sBAAuB,EAAM,CAAC,CAChE,IACA,CACEC,EACAC,IAEgBC,EACbC,GAAQ,CACP,IAAMC,EAAOJ,EAAWG,EAAIH,CAAQ,EAAK,CAAC,EAEpCK,EAAeP,EAAK,CACxB,KAAAM,CACF,CAAC,EACGE,EACJ,OAAIC,EAAOF,CAAY,EACrBC,EAAUH,EAAIE,CAAY,EAE1BC,EAAUD,EAEL,CACL,GAAGD,EACH,GAAGE,CACL,CACF,EACA,MAAOH,EAAKK,EAAKC,IAA4C,CAC3D,IAAML,EAAOJ,EAAWG,EAAIH,CAAQ,EAAK,CAAC,EACpC,CAAE,sBAAAU,CAAsB,EAC3B,MAAMX,EAAM,CACX,YAAa,CACX,KAAAK,EACA,IAAAD,EACA,IAAAK,CACF,EACA,OAAQC,CACV,CAAC,GAAM,CAAC,EACV,GAAKC,GAKH,GAAIT,EACF,OAAOO,EAAIP,EAAcQ,CAAoB,UAL3CT,EACF,OAAOQ,EAAIR,EAAUS,CAAoB,EAO7C,MAAO,CAAE,sBAAAC,CAAsB,CACjC,CACF,EDrDG,SAASC,EAKdC,EACAC,EACAC,EACA,CAEA,IAAMC,EAA0D,CAC9D,KAAM,CAAC,CAAE,KAAAC,CAAK,IACLC,EAAMC,GAAQN,EAAKM,EAAK,CAAE,KAAAF,CAAK,CAAC,CAAC,EAE1C,MAAOH,EACH,CAAC,CAAE,YAAa,CAAE,IAAAM,EAAK,IAAAD,EAAK,KAAAF,CAAK,EAAG,OAAAI,CAAO,IACzCP,EAAMK,EAAKC,EAAKC,EAAQ,CAAE,KAAAJ,CAAK,CAAC,EAClC,MACN,EACA,OAAQA,GAAwBK,EAAYN,CAAQ,EAAEC,EAAMF,CAAgB,CAC9E","names":["atom","atom","atom","isAtom","value","enhanceWith","read","write","lastAtom","fallbackAtom","atom","get","last","possibleAtom","notAtom","isAtom","set","update","shouldAbortNextSetter","atomEnhancer","read","write","fallbackEnhancer","enhancer","last","atom","get","set","update","enhanceWith"]}