// This simplified polyfill attempts to follow the ECMAScript Observable proposal. // See https://github.com/zenparsing/es-observable import $$observable from 'symbol-observable'; export type CleanupFunction = () => void; export type SubscriberFunction = (observer: Observer) => (Subscription | CleanupFunction); function isSubscription(subscription: Function | Subscription): subscription is Subscription { return (subscription).unsubscribe !== undefined; } export class Observable { private subscriberFunction: SubscriberFunction; constructor(subscriberFunction: SubscriberFunction) { this.subscriberFunction = subscriberFunction; } public [$$observable]() { return this; } public subscribe(observer: Observer): Subscription { let subscriptionOrCleanupFunction = this.subscriberFunction(observer); if (isSubscription(subscriptionOrCleanupFunction)) { return subscriptionOrCleanupFunction; } else { return { unsubscribe: subscriptionOrCleanupFunction, }; } } } export interface Observer { next?: (value: T) => void; error?: (error: Error) => void; complete?: () => void; } export interface Subscription { unsubscribe: CleanupFunction; }