{"version":3,"file":"observable-CkXWrCsV.mjs","names":[],"sources":["../src/observable/operators.ts","../src/observable/behaviorSubject.ts"],"sourcesContent":["import { observable } from './observable';\nimport type {\n  MonoTypeOperatorFunction,\n  Observer,\n  OperatorFunction,\n  Unsubscribable,\n} from './types';\n\nexport function map<TValueBefore, TError, TValueAfter>(\n  project: (value: TValueBefore, index: number) => TValueAfter,\n): OperatorFunction<TValueBefore, TError, TValueAfter, TError> {\n  return (source) => {\n    return observable((destination) => {\n      let index = 0;\n      const subscription = source.subscribe({\n        next(value) {\n          destination.next(project(value, index++));\n        },\n        error(error) {\n          destination.error(error);\n        },\n        complete() {\n          destination.complete();\n        },\n      });\n      return subscription;\n    });\n  };\n}\n\ninterface ShareConfig {}\nexport function share<TValue, TError>(\n  _opts?: ShareConfig,\n): MonoTypeOperatorFunction<TValue, TError> {\n  return (source) => {\n    let refCount = 0;\n\n    let subscription: Unsubscribable | null = null;\n    // True while `source.subscribe` runs, so subscribers added by a synchronous\n    // `next` join the starting source instead of starting another one\n    let isConnecting = false;\n    let observers = new Set<Partial<Observer<TValue, TError>>>();\n\n    function startIfNeeded() {\n      if (subscription || isConnecting) {\n        return;\n      }\n      isConnecting = true;\n      let isDone = false;\n      let sourceSubscription: Unsubscribable;\n      try {\n        sourceSubscription = source.subscribe({\n          next(value) {\n            notify(observers, (observer) => observer.next?.(value));\n          },\n          error(error) {\n            isDone = true;\n            terminate((observer) => observer.error?.(error));\n          },\n          complete() {\n            isDone = true;\n            terminate((observer) => observer.complete?.());\n          },\n        });\n      } finally {\n        isConnecting = false;\n      }\n      // A synchronous terminal event fires before `subscribe` returns, and its\n      // callbacks may already have started a new source\n      if (isDone) {\n        sourceSubscription.unsubscribe();\n      } else {\n        subscription = sourceSubscription;\n      }\n    }\n    function notify(\n      targets: Set<Partial<Observer<TValue, TError>>>,\n      callback: (observer: Partial<Observer<TValue, TError>>) => void,\n    ) {\n      for (const observer of [...targets]) {\n        if (targets.has(observer)) {\n          callback(observer);\n        }\n      }\n    }\n    function terminate(\n      callback: (observer: Partial<Observer<TValue, TError>>) => void,\n    ) {\n      // Cleared before notifying so a subscriber added during the callback\n      // starts a fresh source whose events reach only the observers that\n      // joined it; the old source is torn down only after every observer has\n      // been notified, mirroring subscription order.\n      const _sub = subscription;\n      const terminatedObservers = observers;\n      subscription = null;\n      observers = new Set();\n      isConnecting = false;\n      try {\n        notify(terminatedObservers, callback);\n      } finally {\n        _sub?.unsubscribe();\n      }\n    }\n    function resetSource() {\n      const _sub = subscription;\n      subscription = null;\n      _sub?.unsubscribe();\n    }\n    function resetIfNeeded() {\n      // \"resetOnRefCountZero\"\n      if (refCount === 0 && subscription) {\n        resetSource();\n      }\n    }\n\n    return observable((subscriber) => {\n      refCount++;\n\n      const subscriberObservers = observers;\n      subscriberObservers.add(subscriber);\n      startIfNeeded();\n      return {\n        unsubscribe() {\n          refCount--;\n          resetIfNeeded();\n\n          subscriberObservers.delete(subscriber);\n        },\n      };\n    });\n  };\n}\n\nexport function tap<TValue, TError>(\n  observer: Partial<Observer<TValue, TError>>,\n): MonoTypeOperatorFunction<TValue, TError> {\n  return (source) => {\n    return observable((destination) => {\n      return source.subscribe({\n        next(value) {\n          observer.next?.(value);\n          destination.next(value);\n        },\n        error(error) {\n          observer.error?.(error);\n          destination.error(error);\n        },\n        complete() {\n          observer.complete?.();\n          destination.complete();\n        },\n      });\n    });\n  };\n}\n\nconst distinctUnsetMarker = Symbol();\nexport function distinctUntilChanged<TValue, TError>(\n  compare: (a: TValue, b: TValue) => boolean = (a, b) => a === b,\n): MonoTypeOperatorFunction<TValue, TError> {\n  return (source) => {\n    return observable((destination) => {\n      let lastValue: TValue | typeof distinctUnsetMarker = distinctUnsetMarker;\n\n      return source.subscribe({\n        next(value) {\n          if (lastValue !== distinctUnsetMarker && compare(lastValue, value)) {\n            return;\n          }\n          lastValue = value;\n          destination.next(value);\n        },\n        error(error) {\n          destination.error(error);\n        },\n        complete() {\n          destination.complete();\n        },\n      });\n    });\n  };\n}\n\nconst isDeepEqual = <T>(a: T, b: T): boolean => {\n  if (a === b) {\n    return true;\n  }\n  const bothAreObjects =\n    a && b && typeof a === 'object' && typeof b === 'object';\n\n  return (\n    !!bothAreObjects &&\n    Object.keys(a).length === Object.keys(b).length &&\n    Object.entries(a).every(([k, v]) => isDeepEqual(v, b[k as keyof T]))\n  );\n};\nexport function distinctUntilDeepChanged<\n  TValue,\n  TError,\n>(): MonoTypeOperatorFunction<TValue, TError> {\n  return distinctUntilChanged(isDeepEqual);\n}\n","import { observable } from './observable';\nimport type { Observable, Observer } from './types';\n\nexport interface BehaviorSubject<TValue> extends Observable<TValue, never> {\n  observable: Observable<TValue, never>;\n  next: (value: TValue) => void;\n  get: () => TValue;\n}\n\nexport interface ReadonlyBehaviorSubject<TValue> extends Omit<\n  BehaviorSubject<TValue>,\n  'next'\n> {}\n\n/**\n * @internal\n * An observable that maintains and provides a \"current value\" to subscribers\n * @see https://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubject\n */\nexport function behaviorSubject<TValue>(\n  initialValue: TValue,\n): BehaviorSubject<TValue> {\n  let value: TValue = initialValue;\n\n  const observerList: Observer<TValue, never>[] = [];\n\n  const addObserver = (observer: Observer<TValue, never>) => {\n    if (value !== undefined) {\n      observer.next(value);\n    }\n    observerList.push(observer);\n  };\n  const removeObserver = (observer: Observer<TValue, never>) => {\n    observerList.splice(observerList.indexOf(observer), 1);\n  };\n\n  const obs = observable<TValue, never>((observer) => {\n    addObserver(observer);\n    return () => {\n      removeObserver(observer);\n    };\n  }) as BehaviorSubject<TValue>;\n\n  obs.next = (nextValue: TValue) => {\n    if (value === nextValue) {\n      return;\n    }\n    value = nextValue;\n    for (const observer of observerList) {\n      observer.next(nextValue);\n    }\n  };\n\n  obs.get = () => value;\n\n  return obs;\n}\n"],"mappings":"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"}