From d1432ccadc3eb42771edd103e7a3b7d8b119c540 Mon Sep 17 00:00:00 2001 From: Ruben Taelman Date: Thu, 21 Sep 2017 15:58:58 +0200 Subject: [PATCH] Add asynciterator typings --- types/asynciterator/asynciterator-tests.ts | 135 +++++++++++++++++ types/asynciterator/index.d.ts | 164 +++++++++++++++++++++ types/asynciterator/tsconfig.json | 23 +++ types/asynciterator/tslint.json | 1 + 4 files changed, 323 insertions(+) create mode 100644 types/asynciterator/asynciterator-tests.ts create mode 100644 types/asynciterator/index.d.ts create mode 100644 types/asynciterator/tsconfig.json create mode 100644 types/asynciterator/tslint.json diff --git a/types/asynciterator/asynciterator-tests.ts b/types/asynciterator/asynciterator-tests.ts new file mode 100644 index 0000000000..bd4b62c0fe --- /dev/null +++ b/types/asynciterator/asynciterator-tests.ts @@ -0,0 +1,135 @@ +import { ArrayIterator, AsyncIterator, BufferedIterator, ClonedIterator, EmptyIterator, IntegerIterator, + MultiTransformIterator, SingletonIterator, SimpleTransformIterator, TransformIterator } from "asynciterator"; + +function test_asynciterator() { + // We can't instantiate an abstract class. + const it1: AsyncIterator = {}; + const read1: number = it1.read(); + it1.each((data: number) => console.log(data)); + it1.each((data: number) => console.log(data), {}); + it1.close(); + + const it2: AsyncIterator = {}; + const read2: string = it2.read(); + it2.each((data: string) => console.log(data)); + it2.each((data: string) => console.log(data), {}); + it2.close(); + + const it3: AsyncIterator> = {}; + const read3: AsyncIterator = it3.read(); + it3.each((data: AsyncIterator) => data.each((data: string) => console.log(data))); + it3.each((data: AsyncIterator) => data.each((data: string) => console.log(data), {}), {}); + it3.close(); + + const readable2: boolean = it1.readable; + const closed2: boolean = it1.closed; + const ended2: boolean = it1.ended; + + it1.setProperty('name1', 123); + it2.setProperty('name2', 'someValue'); + const p1: number = it1.getProperty('name1'); + const p2: string = it1.getProperty('name2'); + it1.getProperty('name1', (value: number) => console.log(value)); + it1.getProperty('name2', (value: string) => console.log(value)); + const ps1: {[id: string]: any} = it1.getProperties(); + it1.setProperties({ name1: 1234, name2: 'someOtherValue' }); + it1.copyProperties(it2, [ 'name1', 'name2' ]); + + const str: string = it1.toString(); + + const stit1: SimpleTransformIterator = it1.transform(); + const stit2: SimpleTransformIterator = it1.map((number: number) => 'i' + number); + const stit3: AsyncIterator = it1.map((number: number) => 'i' + number); + const stit4: AsyncIterator = it2.map(parseInt); + const stit5: AsyncIterator = it1.map((number: number) => number + 1); + const stit6: AsyncIterator = it1.filter((number: number) => number < 10); + const stit7: AsyncIterator = it1.prepend([0, 1, 2]); + const stit8: AsyncIterator = it1.append([0, 1, 2]); + const stit9: AsyncIterator = it1.surround([0, 1, 2], [0, 1, 2]); + const stit10: AsyncIterator = it1.skip(2); + const stit11: AsyncIterator = it1.take(2); + const stit12: AsyncIterator = it1.range(2, 20); + const stit13: AsyncIterator = it1.clone(); + + const intit1: IntegerIterator = AsyncIterator.range(10, 100, 1); + const intit2: IntegerIterator = AsyncIterator.range(10, 100); + const intit3: IntegerIterator = AsyncIterator.range(10); + const intit4: IntegerIterator = AsyncIterator.range(); +} + +function test_emptyiterator() { + const it1: AsyncIterator = new EmptyIterator(); + const it2: AsyncIterator = new EmptyIterator(); +} + +function test_singletoniterator() { + const it1: AsyncIterator = new SingletonIterator(3); + const it2: AsyncIterator = new SingletonIterator('a'); +} + +function test_arrayiterator() { + const it1: AsyncIterator = new ArrayIterator([1, 2, 3]); + const it2: AsyncIterator = new ArrayIterator(['a', 'b', 'c']); +} + +function test_integeriterator() { + const it1: IntegerIterator = new IntegerIterator(); + const it2: AsyncIterator = new IntegerIterator({}); + const it3: AsyncIterator = new IntegerIterator({ start: 0 }); + const it4: AsyncIterator = new IntegerIterator({ end: 100 }); + const it5: AsyncIterator = new IntegerIterator({ step: 10 }); +} + +function test_bufferediterator() { + const it1: BufferedIterator = new BufferedIterator(); + const it2: AsyncIterator = new BufferedIterator({}); + const it3: AsyncIterator = new BufferedIterator({ maxBufferSize: 10 }); + const it4: AsyncIterator = new BufferedIterator({ autoStart: true }); +} + +function test_transformiterator() { + const it1: TransformIterator = new TransformIterator(); + const it2: AsyncIterator = new TransformIterator(); + const it3: AsyncIterator = new TransformIterator(it1); + const it4: AsyncIterator = new TransformIterator(it1, {}); + const it5: AsyncIterator = new TransformIterator(it1, { optional: true }); + const it6: AsyncIterator = new TransformIterator({ source: it1 }); + + const source: AsyncIterator = it1.source; +} + +function test_simpletransformiterator() { + const it1: SimpleTransformIterator = new SimpleTransformIterator(); + const it2: TransformIterator = new SimpleTransformIterator(); + const it3: AsyncIterator = new SimpleTransformIterator(); + const it4: AsyncIterator = new SimpleTransformIterator(it1); + const it5: AsyncIterator = new SimpleTransformIterator(it1, {}); + const it6: AsyncIterator = new SimpleTransformIterator({}); + const it7: AsyncIterator = new SimpleTransformIterator({ optional: true }); + const it8: AsyncIterator = new SimpleTransformIterator({ source: it1 }); + const it9: AsyncIterator = new SimpleTransformIterator({ offset: 2 }); + const it10: AsyncIterator = new SimpleTransformIterator({ limit: 2 }); + const it11: AsyncIterator = new SimpleTransformIterator({ prepend: [0, 1, 2] }); + const it12: AsyncIterator = new SimpleTransformIterator({ append: [0, 1, 2] }); + const it13: AsyncIterator = new SimpleTransformIterator( + { filter: (val: number) => val > 10 }); + const it14: AsyncIterator = new SimpleTransformIterator({ map: (val: number) => val + 1 }); + const it15: AsyncIterator = new SimpleTransformIterator( + { transform: (val: number, cb: (result: number) => void) => cb(val + 1) }); +} + +function test_multitransformiterator() { + const it1: MultiTransformIterator = new MultiTransformIterator(); + const it2: TransformIterator = new MultiTransformIterator(); + const it3: AsyncIterator = new MultiTransformIterator(); + const it4: AsyncIterator = new MultiTransformIterator(it1); + const it5: AsyncIterator = new MultiTransformIterator(it1, {}); + const it6: AsyncIterator = new MultiTransformIterator({}); + const it7: AsyncIterator = new MultiTransformIterator({ optional: true }); + const it8: AsyncIterator = new MultiTransformIterator({ source: it1 }); +} + +function test_clonediterator() { + const it1: ClonedIterator = new ClonedIterator(); + const it2: ClonedIterator = new ClonedIterator(it1); +} diff --git a/types/asynciterator/index.d.ts b/types/asynciterator/index.d.ts new file mode 100644 index 0000000000..a7be809137 --- /dev/null +++ b/types/asynciterator/index.d.ts @@ -0,0 +1,164 @@ +// Type definitions for asynciterator 1.1 +// Project: https://github.com/rubenverborgh/AsyncIterator#readme +// Definitions by: Ruben Taelman +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.4 + +/// + +import { EventEmitter } from "events"; + +export abstract class AsyncIterator extends NodeJS.EventEmitter { + protected static STATES: ['INIT', 'OPEN', 'CLOSING', 'CLOSED', 'ENDED']; + protected static INIT: 0; + protected static OPEN: 1; + protected static CLOSING: 2; + protected static CLOSED: 3; + protected static ENDED: 4; + + protected _state: number; + protected _readable: boolean; + protected _destination?: AsyncIterator; + + readable: boolean; + closed: boolean; + ended: boolean; + + constructor(); + + read(): T; + each(callback: (data: T) => void, self?: any): void; + close(): void; + + protected _changeState(newState: number, eventAsync?: boolean): void; + private _hasListeners(eventName: string | symbol): boolean; + // tslint:disable-next-line ban-types + private _addSingleListener(eventName: string | symbol, listener: Function): void; + protected _end(): void; + + getProperty(propertyName: string, callback?: (value: any) => void): any; + setProperty(propertyName: string, value: any): void; + getProperties(): {[id: string]: any}; + setProperties(properties: {[id: string]: any}): void; + copyProperties(source: AsyncIterator, propertyNames: string[]): void; + + toString(): string; + protected _toStringDetails(): string; + + transform(options?: SimpleTransformIteratorOptions): SimpleTransformIterator; + map(mapper: (item: T) => T2, self?: object): SimpleTransformIterator; + filter(filter: (item: T) => boolean, self?: object): SimpleTransformIterator; + prepend(items: T[]): SimpleTransformIterator; + append(items: T[]): SimpleTransformIterator; + surround(prepend: T[], append: T[]): SimpleTransformIterator; + skip(offset: number): SimpleTransformIterator; + take(limit: number): SimpleTransformIterator; + range(start: number, end: number): SimpleTransformIterator; + clone(): ClonedIterator; + + static range(start?: number, end?: number, step?: number): IntegerIterator; +} + +export class EmptyIterator extends AsyncIterator { + _state: 4; +} + +export class SingletonIterator extends AsyncIterator { + constructor(item?: T); +} + +export class ArrayIterator extends AsyncIterator { + constructor(items?: T[]); +} + +export interface IntegerIteratorOptions { + step?: number; + end?: number; + start?: number; +} + +export class IntegerIterator extends AsyncIterator { + protected _step: number; + protected _last: number; + protected _next: number; + + constructor(options?: IntegerIteratorOptions); +} + +export interface BufferedIteratorOptions { + maxBufferSize?: number; + autoStart?: boolean; +} + +export class BufferedIterator extends AsyncIterator { + maxBufferSize: number; + protected _pushedCount: number; + protected _buffer: T[]; + + protected _init(autoStart: boolean): void; + protected _begin(done: () => void): void; + protected _read(count: number, done: () => void): void; + protected _push(item: T): void; + protected _fillBuffer(): void; + protected _completeClose(): void; + protected _flush(done: () => void): void; + + constructor(options?: BufferedIteratorOptions); +} + +export interface TransformIteratorOptions extends BufferedIteratorOptions { + optional?: boolean; + source?: AsyncIterator; +} + +export class TransformIterator extends BufferedIterator { + protected _optional: boolean; + source: AsyncIterator; + + protected _validateSource(source: AsyncIterator, allowDestination?: boolean): void; + protected _transform(item: S, done: (result: T) => void): void; + protected _closeWhenDone(): void; + + constructor(source?: AsyncIterator | TransformIteratorOptions, options?: TransformIteratorOptions); +} + +export interface SimpleTransformIteratorOptions extends TransformIteratorOptions { + offset?: number; + limit?: number; + prepend?: T[]; + append?: T[]; + + filter?(item: S): boolean; + map?(item: S): T; + transform?(item: S, callback: (result: T) => void): void; +} + +export class SimpleTransformIterator extends TransformIterator { + protected _offset: number; + protected _limit: number; + protected _prepender?: ArrayIterator; + protected _appender?: ArrayIterator; + + protected _filter?(item: S): boolean; + protected _map?(item: S): T; + protected _transform(item: S, done: (result: T) => void): void; + + protected _insert(inserter: AsyncIterator, done: () => void): void; + + constructor(source?: AsyncIterator | SimpleTransformIteratorOptions, + options?: SimpleTransformIteratorOptions); +} + +export class MultiTransformIterator extends TransformIterator { + _transformerQueue: S[]; + + protected _createTransformer(): AsyncIterator; + + constructor(source?: AsyncIterator | TransformIteratorOptions, options?: TransformIteratorOptions); +} + +export class ClonedIterator extends TransformIterator { + _readPosition: number; + + constructor(source?: AsyncIterator); +} diff --git a/types/asynciterator/tsconfig.json b/types/asynciterator/tsconfig.json new file mode 100644 index 0000000000..8b8b919abc --- /dev/null +++ b/types/asynciterator/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "asynciterator-tests.ts" + ] +} diff --git a/types/asynciterator/tslint.json b/types/asynciterator/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/asynciterator/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }