/// import {global, isPresent} from 'angular2/src/facade/lang'; import {List} from 'angular2/src/facade/collection'; import * as Rx from 'rx'; export {Promise}; export interface PromiseCompleter { promise: Promise; resolve: (value?: R | PromiseLike) => void; reject: (error?: any, stackTrace?: string) => void; } export class PromiseWrapper { static resolve(obj: T): Promise { return Promise.resolve(obj); } static reject(obj: any, _): Promise { return Promise.reject(obj); } // Note: We can't rename this method into `catch`, as this is not a valid // method name in Dart. static catchError(promise: Promise, onError: (error: any) => T | PromiseLike): Promise { return promise.catch(onError); } static all(promises: List): Promise { if (promises.length == 0) return Promise.resolve([]); return Promise.all(promises); } static then(promise: Promise, success: (value: T) => U | PromiseLike, rejection?: (error: any, stack?: any) => U | PromiseLike): Promise { return promise.then(success, rejection); } static wrap(computation: () => T): Promise { return new Promise((res, rej) => { try { res(computation()); } catch (e) { rej(e); } }); } static completer(): PromiseCompleter { var resolve; var reject; var p = new Promise(function(res, rej) { resolve = res; reject = rej; }); return {promise: p, resolve: resolve, reject: reject}; } } export class TimerWrapper { static setTimeout(fn: Function, millis: int): int { return global.setTimeout(fn, millis); } static clearTimeout(id: int): void { global.clearTimeout(id); } static setInterval(fn: Function, millis: int): int { return global.setInterval(fn, millis); } static clearInterval(id: int): void { global.clearInterval(id); } } export class ObservableWrapper { // TODO(vsavkin): when we use rxnext, try inferring the generic type from the first arg static subscribe(emitter: Observable, onNext: (value: T) => void, onThrow: (exception: any) => void = null, onReturn: () => void = null): Object { return emitter.observer({next: onNext, throw: onThrow, return: onReturn}); } static isObservable(obs: any): boolean { return obs instanceof Observable; } static dispose(subscription: any) { subscription.dispose(); } static callNext(emitter: EventEmitter, value: any) { emitter.next(value); } static callThrow(emitter: EventEmitter, error: any) { emitter.throw(error); } static callReturn(emitter: EventEmitter) { emitter.return (null); } } // TODO: vsavkin change to interface export class Observable { observer(generator: any): Object { return null; } } /** * Use Rx.Observable but provides an adapter to make it work as specified here: * https://github.com/jhusain/observable-spec * * Once a reference implementation of the spec is available, switch to it. */ export class EventEmitter extends Observable { _subject: Rx.Subject; _immediateScheduler; constructor() { super(); this._subject = new Rx.Subject(); this._immediateScheduler = (Rx.Scheduler).immediate; } observer(generator: any): Rx.IDisposable { return this._subject.observeOn(this._immediateScheduler) .subscribe((value) => { setTimeout(() => generator.next(value)); }, (error) => generator.throw ? generator.throw(error) : null, () => generator.return ? generator.return () : null); } toRx(): Rx.Observable { return this._subject; } next(value: any) { this._subject.onNext(value); } throw(error: any) { this._subject.onError(error); } return (value?: any) { this._subject.onCompleted(); } }