{"version":3,"file":"observe.js","names":[],"sources":["esm/observe.js"],"sourcesContent":["import React from \"react\";\nimport { isEqualSubsetShallow } from \"./comparators\";\nimport { UNWRAP_PROXY } from \"./constants\";\nimport { trackStoresAccess } from \"./useStore\";\nconst logUpdate = process.env.NODE_ENV === \"development\" ? (fn, stores, last, next) => {\n  const getStoreLogName = (store) => {\n    const str = store[UNWRAP_PROXY] ?? store;\n    return `${str.constructor.name}${store.props?.id ? `:${store.props.id}` : \"\"}`;\n  };\n  const storeNames = stores.map(getStoreLogName).join(\", \");\n  const name = `\\u{1F311}  \\u25B6\\uFE0F %c${fn.name} ${storeNames} () ${last} => ${next}`;\n  console.groupCollapsed(name, \"color: tomato;\");\n  console.groupCollapsed(\"trace >\");\n  console.trace();\n  console.groupEnd();\n  console.info(\"  next\", next);\n  console.groupEnd();\n} : null;\nfunction observe(fn) {\n  let prev = getObserverValueAndStoresAccessed(fn);\n  let disposeValue = null;\n  const subscribe = () => {\n    const stores = [...prev.storeInfos];\n    return subscribeToStores(stores, () => {\n      disposeValue?.();\n      const next = getObserverValueAndStoresAccessed(fn);\n      if (typeof next.value === \"function\") {\n        disposeValue = next.value;\n        if (process.env.NODE_ENV === \"development\") {\n          logUpdate(fn, [...next.storeInfos], \"(fn)\", \"(fn)\");\n        }\n        return;\n      }\n      if (isEqualSubsetShallow(prev.storeInfos, next.storeInfos) && isEqualSubsetShallow(prev.value, next.value)) {\n        return;\n      }\n      if (process.env.NODE_ENV === \"development\") {\n        logUpdate(fn, [...next.storeInfos], prev.value, next.value);\n      }\n      prev = next;\n      dispose();\n      dispose = subscribe();\n    });\n  };\n  let dispose = subscribe();\n  return {\n    dispose: () => {\n      dispose();\n      disposeValue?.();\n    },\n    getValue: () => prev.value\n  };\n}\nfunction useObserve(fn) {\n  const [state, setState] = React.useState(() => {\n    return getObserverValueAndStoresAccessed(fn);\n  });\n  React.useEffect(() => {\n    let dispose;\n    const unsub = subscribeToStores([...state.storeInfos], () => {\n      dispose?.();\n      const next = getObserverValueAndStoresAccessed(fn);\n      const nextStoreInfos = [...next.storeInfos];\n      const prevStoreInfos = [...state.storeInfos];\n      if (typeof next.value === \"function\") {\n        if (process.env.NODE_ENV === \"development\") {\n          logUpdate(fn, nextStoreInfos, \"(fn)\", \"(fn)\");\n        }\n        dispose = next.value;\n        return;\n      }\n      setState((prev) => {\n        if (isEqualSubsetShallow(prevStoreInfos, nextStoreInfos) && isEqualSubsetShallow(prev.value, next.value)) {\n          return prev;\n        }\n        if (process.env.NODE_ENV === \"development\") {\n          logUpdate(fn, nextStoreInfos, prev.value, next.value);\n        }\n        return next;\n      });\n    });\n    return () => {\n      unsub();\n      dispose?.();\n    };\n  }, [[...state.storeInfos].map((i) => i.uid).join(\",\")]);\n  return state.value;\n}\nfunction getObserverValueAndStoresAccessed(selector) {\n  const storeInfos = /* @__PURE__ */ new Set();\n  const dispose = trackStoresAccess((storeInfo) => {\n    storeInfos.add(storeInfo);\n  });\n  const value = selector();\n  dispose();\n  return {\n    value,\n    storeInfos\n  };\n}\nfunction subscribeToStores(storeInfos, onUpdate) {\n  const disposes = [];\n  let isUpdating = false;\n  const onUpdateDebouncedWithoutTracking = () => {\n    if (isUpdating) return;\n    isUpdating = true;\n    queueMicrotask(() => {\n      try {\n        for (const storeInfo of storeInfos) {\n          storeInfo.disableTracking = true;\n        }\n        onUpdate();\n      } finally {\n        isUpdating = false;\n        for (const storeInfo of storeInfos) {\n          storeInfo.disableTracking = false;\n        }\n      }\n    });\n  };\n  for (const storeInfo of storeInfos) {\n    disposes.push(storeInfo.subscribe(onUpdateDebouncedWithoutTracking));\n  }\n  return () => {\n    disposes.forEach((x) => x());\n  };\n}\nexport {\n  observe,\n  useObserve\n};\n//# sourceMappingURL=observe.js.map\n"],"mappings":"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"}