{"version":3,"file":"useSelector.cjs","names":["getSnapshot"],"sources":["../src/useSelector.ts"],"sourcesContent":["import type {\n  AnyMachine,\n  InterpreterFrom,\n  StateFrom,\n} from '@bemedev/app-ts';\nimport { useSync } from '@bemedev/react-sync';\nimport { dequal } from 'dequal';\nimport { useCallback, useRef } from 'react';\nimport { getSnapshot, type Compare_F } from './utils';\n\nexport const useSelector = <\n  const M extends AnyMachine = AnyMachine,\n  T = StateFrom<M>,\n>(\n  service: InterpreterFrom<M>,\n  selector: (emitted: StateFrom<M>) => T,\n  compare: Compare_F = dequal,\n) => {\n  type _State = StateFrom<M>;\n\n  const initialStateCacheRef = useRef<_State>(\n    undefined as unknown as _State,\n  );\n\n  type Listener = (state: _State) => void;\n\n  const subscribe = useCallback(\n    (listerner: Listener) => {\n      const subscriber = service.subscribe(listerner);\n      return () => subscriber.unsubscribe();\n    },\n    [service],\n  );\n\n  const boundGetSnapshot = useCallback(() => {\n    return getSnapshot<M>(service, initialStateCacheRef as any);\n  }, [service]);\n\n  const selectedSnapshot = useSync(\n    subscribe,\n    boundGetSnapshot,\n    boundGetSnapshot,\n    selector,\n    compare,\n  );\n\n  return selectedSnapshot;\n};\n"],"mappings":";;;;;;;AAUA,MAAa,eAIX,SACA,UACA,UAAqB,OAAA,WAClB;CAGH,MAAM,wBAAA,GAAA,MAAA,QACJ,KAAA,EACD;CAID,MAAM,aAAA,GAAA,MAAA,cACH,cAAwB;EACvB,MAAM,aAAa,QAAQ,UAAU,UAAU;AAC/C,eAAa,WAAW,aAAa;IAEvC,CAAC,QAAQ,CACV;CAED,MAAM,oBAAA,GAAA,MAAA,mBAAqC;AACzC,SAAOA,0BAAAA,YAAe,SAAS,qBAA4B;IAC1D,CAAC,QAAQ,CAAC;AAUb,SAAA,GAAA,oBAAA,SAPE,WACA,kBACA,kBACA,UACA,QACD"}