{"version":3,"file":"observable-DwUFSuKv.mjs","names":[],"sources":["../src/observable/observable.ts"],"sourcesContent":["import type { Result } from '../unstable-core-do-not-import';\nimport type {\n  Observable,\n  Observer,\n  OperatorFunction,\n  TeardownLogic,\n  UnaryFunction,\n  Unsubscribable,\n} from './types';\n\n/** @public */\nexport type inferObservableValue<TObservable> =\n  TObservable extends Observable<infer TValue, unknown> ? TValue : never;\n\n/** @public */\nexport function isObservable(x: unknown): x is Observable<unknown, unknown> {\n  return typeof x === 'object' && x !== null && 'subscribe' in x;\n}\n\n/** @public */\nexport function observable<TValue, TError = unknown>(\n  subscribe: (observer: Observer<TValue, TError>) => TeardownLogic,\n): Observable<TValue, TError> {\n  const self: Observable<TValue, TError> = {\n    subscribe(observer) {\n      let teardownRef: TeardownLogic | null = null;\n      let isDone = false;\n      let unsubscribed = false;\n      let teardownImmediately = false;\n      function unsubscribe() {\n        if (teardownRef === null) {\n          teardownImmediately = true;\n          return;\n        }\n        if (unsubscribed) {\n          return;\n        }\n        unsubscribed = true;\n\n        if (typeof teardownRef === 'function') {\n          teardownRef();\n        } else if (teardownRef) {\n          teardownRef.unsubscribe();\n        }\n      }\n      teardownRef = subscribe({\n        next(value) {\n          if (isDone) {\n            return;\n          }\n          observer.next?.(value);\n        },\n        error(err) {\n          if (isDone) {\n            return;\n          }\n          isDone = true;\n          observer.error?.(err);\n          unsubscribe();\n        },\n        complete() {\n          if (isDone) {\n            return;\n          }\n          isDone = true;\n          observer.complete?.();\n          unsubscribe();\n        },\n      });\n      if (teardownImmediately) {\n        unsubscribe();\n      }\n      return {\n        unsubscribe,\n      };\n    },\n    pipe(\n      ...operations: OperatorFunction<any, any, any, any>[]\n    ): Observable<any, any> {\n      return operations.reduce(pipeReducer, self);\n    },\n  };\n  return self;\n}\n\nfunction pipeReducer(prev: any, fn: UnaryFunction<any, any>) {\n  return fn(prev);\n}\n\n/** @internal */\nexport function observableToPromise<TValue>(\n  observable: Observable<TValue, unknown>,\n) {\n  const ac = new AbortController();\n  const promise = new Promise<TValue>((resolve, reject) => {\n    let isDone = false;\n    function onDone() {\n      if (isDone) {\n        return;\n      }\n      isDone = true;\n      obs$.unsubscribe();\n    }\n    ac.signal.addEventListener('abort', () => {\n      reject(ac.signal.reason);\n    });\n    const obs$ = observable.subscribe({\n      next(data) {\n        isDone = true;\n        resolve(data);\n        onDone();\n      },\n      error(data) {\n        reject(data);\n      },\n      complete() {\n        ac.abort();\n        onDone();\n      },\n    });\n  });\n  return promise;\n}\n\n/**\n * @internal\n */\nfunction observableToReadableStream<TValue>(\n  observable: Observable<TValue, unknown>,\n  signal: AbortSignal,\n): ReadableStream<Result<TValue>> {\n  let unsub: Unsubscribable | null = null;\n\n  const onAbort = () => {\n    unsub?.unsubscribe();\n    unsub = null;\n    signal.removeEventListener('abort', onAbort);\n  };\n\n  return new ReadableStream<Result<TValue>>({\n    start(controller) {\n      unsub = observable.subscribe({\n        next(data) {\n          controller.enqueue({ ok: true, value: data });\n        },\n        error(error) {\n          controller.enqueue({ ok: false, error });\n          controller.close();\n        },\n        complete() {\n          controller.close();\n        },\n      });\n\n      if (signal.aborted) {\n        onAbort();\n      } else {\n        signal.addEventListener('abort', onAbort, { once: true });\n      }\n    },\n    cancel() {\n      onAbort();\n    },\n  });\n}\n\n/** @internal */\nexport function observableToAsyncIterable<TValue>(\n  observable: Observable<TValue, unknown>,\n  signal: AbortSignal,\n): AsyncIterable<TValue> {\n  const stream = observableToReadableStream(observable, signal);\n\n  const reader = stream.getReader();\n  const iterator: AsyncIterator<TValue> = {\n    async next() {\n      const value = await reader.read();\n      if (value.done) {\n        return {\n          value: undefined,\n          done: true,\n        };\n      }\n      const { value: result } = value;\n      if (!result.ok) {\n        throw result.error;\n      }\n      return {\n        value: result.value,\n        done: false,\n      };\n    },\n    async return() {\n      await reader.cancel();\n      return {\n        value: undefined,\n        done: true,\n      };\n    },\n  };\n  return {\n    [Symbol.asyncIterator]() {\n      return iterator;\n    },\n  };\n}\n"],"mappings":"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"}