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<typeof Observable>['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<T, R>( | |
init: (liftedSource: Observable<T>, subscriber: Subscriber<R>) => (() => void) | void | |
): OperatorFunction<T, R> { | |
return (source: Observable<T>) => { | |
if (hasLift(source)) { | |
return source.lift(function (this: Subscriber<R>, liftedSource: Observable<T>) { | |
try { | |
return init(liftedSource, this); | |
} catch (err) { | |
this.error(err); | |
} | |
}); | |
} | |
throw new TypeError('Unable to lift unknown Observable type'); | |
}; | |
} | |