From 469c6ab1a66ea32a415f2ee55b3cfd53b837755b Mon Sep 17 00:00:00 2001 From: Kombu Date: Tue, 11 Apr 2017 00:08:50 +0800 Subject: [PATCH] [zen-observable.d.ts] Add definitions for zen-observable --- types/zen-observable/index.d.ts | 63 +++++++++++ types/zen-observable/tsconfig.json | 22 ++++ types/zen-observable/tslint.json | 3 + types/zen-observable/zen-observable-tests.ts | 105 +++++++++++++++++++ 4 files changed, 193 insertions(+) create mode 100644 types/zen-observable/index.d.ts create mode 100644 types/zen-observable/tsconfig.json create mode 100644 types/zen-observable/tslint.json create mode 100644 types/zen-observable/zen-observable-tests.ts diff --git a/types/zen-observable/index.d.ts b/types/zen-observable/index.d.ts new file mode 100644 index 0000000000..0ebb18ef37 --- /dev/null +++ b/types/zen-observable/index.d.ts @@ -0,0 +1,63 @@ +// Type definitions for zen-observable v0.5.1 +// Project: https://github.com/zenparsing/zen-observable +// Definitions by: Kombu +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +declare global { + interface SymbolConstructor { + observable: symbol; + } +} + +declare global { + namespace ZenObservable { + interface SubscriptionObserver { + closed: boolean; + next(value: T): void; + error(errorValue: any): void; + complete(): void; + } + + interface Subscription { + closed: boolean; + unsubscribe(): void; + } + + interface Observer { + start?(subscription: Subscription): any; + next?(value: T): void; + error?(errorValue: any): void; + complete?(): void; + } + + type Subscriber = (observer: SubscriptionObserver) => void | (() => void) | Subscription; + + interface ObservableLike { + subscribe?: Subscriber; + [Symbol.observable](): Observable | ObservableLike; + } + } +} + +declare class Observable { + constructor(subscriber: ZenObservable.Subscriber) + + subscribe(observer: ZenObservable.Observer): ZenObservable.Subscription; + subscribe(onNext: (value: T) => void, onError?: (error: any) => void, onComplete?: () => void): ZenObservable.Subscription; + + [Symbol.observable](): Observable; + + forEach(callback: (value: T) => void): Promise; + map(callback: (value: T) => R): Observable; + filter(callback: (value: T) => boolean): Observable; + reduce(callback: (previousValue: T, currentValue: T) => T, initialValue?: T): Observable; + reduce(callback: (previousValue: R, currentValue: T) => R, initialValue?: R): Observable; + flatMap(callback: (value: T) => ZenObservable.ObservableLike): Observable; +} + +declare namespace Observable { + function from(observable: Observable | ZenObservable.ObservableLike | ArrayLike): Observable; + function of(...items: T[]): Observable; +} + +export = Observable; diff --git a/types/zen-observable/tsconfig.json b/types/zen-observable/tsconfig.json new file mode 100644 index 0000000000..cfdae044d6 --- /dev/null +++ b/types/zen-observable/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "zen-observable-tests.ts" + ] +} diff --git a/types/zen-observable/tslint.json b/types/zen-observable/tslint.json new file mode 100644 index 0000000000..ec365f164b --- /dev/null +++ b/types/zen-observable/tslint.json @@ -0,0 +1,3 @@ +{ + "extends": "../tslint.json" +} diff --git a/types/zen-observable/zen-observable-tests.ts b/types/zen-observable/zen-observable-tests.ts new file mode 100644 index 0000000000..c4a61b24ac --- /dev/null +++ b/types/zen-observable/zen-observable-tests.ts @@ -0,0 +1,105 @@ +import * as Observable from 'zen-observable'; + +const assert = (val: boolean) => { + if (val !== true) { + throw new Error('Assertion Failure'); + } +}; + +/** + * Observable + */ + +new Observable(observer => { + [1, 2, 3].forEach(one => observer.next(one)); + observer.complete(); +}) + .subscribe(val => assert(typeof val === 'number')); + +/** + * Observable.of + */ + +Observable.of(1, 2, 3) + .subscribe(val => assert(typeof val === 'number')); + +/** + * Observable.from + */ + +Observable.from(Observable.of(1, 2, 3)) + .subscribe(val => assert(typeof val === 'number')); + +Observable.from([1, 2, 3]) + .subscribe(val => assert(typeof val === 'number')); + +Observable.from({ + subscribe(observer: ZenObservable.SubscriptionObserver) { + [1, 2, 3].forEach(one => observer.next(one)); + observer.complete(); + }, + [Symbol.observable](this: ZenObservable.ObservableLike) { + return this; + } +}) + .subscribe(val => assert(typeof val === 'number')); + +Observable.from({ + [Symbol.observable]() { + return Observable.of(1, 2, 3); + } +}) + .subscribe(val => assert(typeof val === 'number')); + +/** + * observable.forEach + */ + +Observable.of(1, 2, 3) + .forEach(val => assert(typeof val === 'number')); + +/** + * observable.map + */ + +Observable.of(1, 2, 3) + .map(val => val.toString()) + .subscribe(val => assert(typeof val === 'string')); + +/** + * observable.filter + */ + +Observable.of(1, 2, 3) + .filter(val => val !== 2) + .subscribe(val => assert(typeof val === 'number' && val !== 2)); + +/** + * observable.reduce + */ + +Observable.of(1, 2, 3) + .reduce((acc, val) => acc + val) + .subscribe(val => assert(val === 6)); + +Observable.of(1, 2, 3) + .reduce((acc, val) => acc + val, '') + .subscribe(val => assert(val === '123')); + +/** + * observable.flatMap + */ + +Observable.of(1, 2, 3) + .flatMap(val => Observable.of(val.toString())) + .subscribe(val => assert(typeof val === 'string')); + +/** + * ZenObservable + */ + +let subscriptionObserver: ZenObservable.SubscriptionObserver; +let subscription: ZenObservable.Subscription; +let observer: ZenObservable.Observer; +let subscriber: ZenObservable.Subscriber; +let observableLike: ZenObservable.ObservableLike;