import { Observable } from '../Observable'; import { Subscriber } from '../Subscriber'; import { OperatorFunction } from '../types'; import { isFunction } from './isFunction'; /** * Used to determine if an object is an Observable with a lift function. */ export function hasLift(source: any): source is { lift: InstanceType['lift'] } { return isFunction(source?.lift); } /** * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way. * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription. */ export function operate( init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void ): OperatorFunction { return (source: Observable) => { if (hasLift(source)) { return source.lift(function (this: Subscriber, liftedSource: Observable) { try { return init(liftedSource, this); } catch (err) { this.error(err); } }); } throw new TypeError('Unable to lift unknown Observable type'); }; }