import { SubscribableObserver } from './SubscribableObserver' export class SubscribablePromise { private observer = new SubscribableObserver() private promise = Object.assign( new Promise

((resolve, reject) => { setTimeout(() => { this.observer.subscribe(undefined, resolve, reject) }, 0) }), this ) constructor(executor: (observer: SubscribableObserver) => void | Promise

) { // Defear setTimeout(() => this.init(executor), 1) } public subscribe(onNext: (next: T) => void) { return this.observer.subscribe(onNext) } public next(onNext: (next: T) => void) { this.observer.subscribe(onNext) return this } public then(onfulfilled?: (value: P) => any, onrejected?: (error: any) => any) { return Object.assign(this.promise.then(onfulfilled, onrejected), this) } public catch(onrejected?: (error: any) => any) { return Object.assign(this.promise.catch(onrejected), this) } public finally(onfinally?: () => any) { return Object.assign(this.promise.finally(onfinally), this) } private init(executor: (observer: SubscribableObserver) => void | Promise

) { const execution = executor(this.observer) Promise.resolve(execution as any) .then((result) => { if (typeof (execution as any).then === 'function') { this.observer.complete(result) } }) .catch((result) => { if (typeof (execution as any).then === 'function') { this.observer.error(result) } }) } }