{"version":3,"file":"store.cjs","names":["createAtom","toObserver"],"sources":["../src/store.ts"],"sourcesContent":["import { createAtom, toObserver } from './atom'\nimport type { Atom, Observer, Subscription } from './types'\n\nexport type StoreAction = (...args: Array<any>) => any\n\nexport type StoreActionMap = Record<string, StoreAction>\n\nexport type StoreActionsFactory<T, TActions extends StoreActionMap> = (store: {\n  setState: Store<T>['setState']\n  get: Store<T>['get']\n}) => TActions\n\ntype NonFunction<T> = T extends (...args: Array<any>) => any ? never : T\n\nexport class Store<T, TActions extends StoreActionMap = never> {\n  private atom: Atom<T>\n  public readonly actions!: TActions\n  constructor(getValue: (prev?: NoInfer<T>) => T)\n  constructor(initialValue: T)\n  constructor(\n    initialValue: NonFunction<T>,\n    actionsFactory: StoreActionsFactory<T, TActions>,\n  )\n  constructor(\n    valueOrFn: T | ((prev?: T) => T),\n    actionsFactory?: StoreActionsFactory<T, TActions>,\n  ) {\n    // createAtom has overloads that return ReadonlyAtom<T> for functions and Atom<T> for values\n    // Store always needs Atom<T> for setState, so we assert the return type\n    this.atom = createAtom(\n      valueOrFn as T | ((prev?: NoInfer<T>) => T),\n    ) as Atom<T>\n\n    // bind for safe destructuring\n    this.get = this.get.bind(this)\n    this.setState = this.setState.bind(this)\n    this.subscribe = this.subscribe.bind(this)\n\n    if (actionsFactory) {\n      this.actions = actionsFactory(this)\n    }\n  }\n  public setState(updater: (prev: T) => T) {\n    this.atom.set(updater)\n  }\n  public get state() {\n    return this.atom.get()\n  }\n  public get() {\n    return this.state\n  }\n  public subscribe(\n    observerOrFn: Observer<T> | ((value: T) => void),\n  ): Subscription {\n    return this.atom.subscribe(toObserver(observerOrFn))\n  }\n}\n\nexport class ReadonlyStore<T> implements Omit<\n  Store<T>,\n  'setState' | 'actions'\n> {\n  private atom: Atom<T>\n  constructor(getValue: (prev?: NoInfer<T>) => T)\n  constructor(initialValue: T)\n  constructor(valueOrFn: T | ((prev?: T) => T)) {\n    // createAtom has overloads that return ReadonlyAtom<T> for functions and Atom<T> for values\n    // Store always needs Atom<T> for setState, so we assert the return type\n    this.atom = createAtom(\n      valueOrFn as T | ((prev?: NoInfer<T>) => T),\n    ) as Atom<T>\n  }\n  public get state() {\n    return this.atom.get()\n  }\n  public get() {\n    return this.state\n  }\n  public subscribe(\n    observerOrFn: Observer<T> | ((value: T) => void),\n  ): Subscription {\n    return this.atom.subscribe(toObserver(observerOrFn))\n  }\n}\n\nexport function createStore<T>(\n  getValue: (prev?: NoInfer<T>) => T,\n): ReadonlyStore<T>\nexport function createStore<T>(initialValue: T): Store<T>\nexport function createStore<T, TActions extends StoreActionMap>(\n  initialValue: NonFunction<T>,\n  actions: StoreActionsFactory<T, TActions>,\n): Store<T, TActions>\nexport function createStore<T, TActions extends StoreActionMap>(\n  valueOrFn: T | ((prev?: T) => T),\n  actions?: StoreActionsFactory<T, TActions>,\n): Store<T, TActions> | Store<T> | ReadonlyStore<T> {\n  if (typeof valueOrFn === 'function') {\n    return new ReadonlyStore(valueOrFn as (prev?: NoInfer<T>) => T)\n  }\n  if (actions) {\n    return new Store(valueOrFn as NonFunction<T>, actions)\n  }\n  return new Store(valueOrFn)\n}\n"],"mappings":";;;AAcA,IAAa,QAAb,MAA+D;CAS7D,YACE,WACA,gBACA;AAGA,OAAK,OAAOA,wBACV,UACD;AAGD,OAAK,MAAM,KAAK,IAAI,KAAK,KAAK;AAC9B,OAAK,WAAW,KAAK,SAAS,KAAK,KAAK;AACxC,OAAK,YAAY,KAAK,UAAU,KAAK,KAAK;AAE1C,MAAI,eACF,MAAK,UAAU,eAAe,KAAK;;CAGvC,AAAO,SAAS,SAAyB;AACvC,OAAK,KAAK,IAAI,QAAQ;;CAExB,IAAW,QAAQ;AACjB,SAAO,KAAK,KAAK,KAAK;;CAExB,AAAO,MAAM;AACX,SAAO,KAAK;;CAEd,AAAO,UACL,cACc;AACd,SAAO,KAAK,KAAK,UAAUC,wBAAW,aAAa,CAAC;;;AAIxD,IAAa,gBAAb,MAGE;CAIA,YAAY,WAAkC;AAG5C,OAAK,OAAOD,wBACV,UACD;;CAEH,IAAW,QAAQ;AACjB,SAAO,KAAK,KAAK,KAAK;;CAExB,AAAO,MAAM;AACX,SAAO,KAAK;;CAEd,AAAO,UACL,cACc;AACd,SAAO,KAAK,KAAK,UAAUC,wBAAW,aAAa,CAAC;;;AAYxD,SAAgB,YACd,WACA,SACkD;AAClD,KAAI,OAAO,cAAc,WACvB,QAAO,IAAI,cAAc,UAAsC;AAEjE,KAAI,QACF,QAAO,IAAI,MAAM,WAA6B,QAAQ;AAExD,QAAO,IAAI,MAAM,UAAU"}