import { EachHandler, EveryHandler, FilterHandler, FindHandler, MapTransformer, ParallelHandler, RaceTransformer, ReduceTransformer, Resolvable, SomeHandler, each, every, filter, find, findIndex, map, reduce, reduceRight, some, } from '.'; export class Chainable extends Promise { each(handler: EachHandler): Promise { let chainable = this.then(values => each(values, handler)); return Promise.resolve(chainable); } every(handler: EveryHandler): Promise { let chainable = this.then(values => every(values, handler)); return Promise.resolve(chainable); } filter(handler: FilterHandler): Chainable { return this.then(values => filter(values, handler)) as Chainable; } find(handler: FindHandler): Promise { let chainable = this.then(values => find(values, handler)); return Promise.resolve(chainable); } findIndex(handler: FindHandler): Promise { let chainable = this.then(values => findIndex(values, handler)); return Promise.resolve(chainable); } map( transformer: MapTransformer, concurrency?: number, ): Chainable { return this.then(values => map(values, transformer, concurrency), ) as Chainable; } parallel(handler: ParallelHandler, concurrency?: number): Promise { let chainable = this.then(values => map(values, handler, concurrency)); return Promise.resolve(chainable).then(() => undefined); } race(transformer: RaceTransformer): Promise { let chainable = this.then(values => Promise.race(values.map(transformer))); return Promise.resolve(chainable); } reduce( transformer: ReduceTransformer, initial: TResult[], ): Chainable; reduce( transformer: ReduceTransformer, initial: TResult, ): Promise; reduce(transformer: ReduceTransformer): Promise; reduce( transformer: ReduceTransformer, ...args: any[] ): Chainable | Promise { let chainable = this.then(values => (reduce as Function)(values, transformer, ...args), ); return Array.isArray(args[0]) ? (chainable as Chainable) : Promise.resolve(chainable); } reduceRight( transformer: ReduceTransformer, initial: TResult[], ): Chainable; reduceRight( transformer: ReduceTransformer, initial: TResult, ): Promise; reduceRight(transformer: ReduceTransformer): Promise; reduceRight( transformer: ReduceTransformer, ...args: any[] ): Chainable | Promise { let chainable = this.then(values => (reduceRight as Function)(values, transformer, ...args), ); return Array.isArray(args[0]) ? (chainable as Chainable) : Promise.resolve(chainable); } some(handler: SomeHandler): Promise { let chainable = this.then(values => some(values, handler)); return Promise.resolve(chainable); } static resolve(): Promise; static resolve(resolvable: Resolvable): Chainable; static resolve(resolvable?: Resolvable): Chainable { return new Chainable(resolve => resolve(resolvable)); } } /** * Wrap given resolvable with a chainable derived of built-in promise. */ export function chainable(resolvable: Resolvable): Chainable { return Chainable.resolve(resolvable); }