/** * Typings */ import { Observer } from './Observer'; import { Subscriber } from './Subscriber'; import { Subscription, TeardownLogic } from './Subscription'; type SubscribeFunction = (obs: Partial>) => Subscription; type SubscriptionFactory = (observer: Observer) => TeardownLogic; export interface IObservable { subscribe: SubscribeFunction; } export interface ObservableConstructor { new (subscriptionFactory: SubscriptionFactory): IObservable; } /** * Implementation */ export class Observable implements IObservable { constructor(private subscriptionFactory: SubscriptionFactory) {} subscribe(obs: Partial>): Subscription { const subscriber = new Subscriber(obs); try { subscriber.add(this.subscriptionFactory(subscriber)); } catch (e) { subscriber.error(e); } return subscriber; } }