import 'typings-global' import * as util from 'util' export interface IResolve { (value?: T | Promise): void } export interface IReject { (reason?: any): void } export type TDeferredStatus = 'pending' | 'fulfilled' | 'rejected' export class Deferred { promise: Promise resolve: IResolve reject: IReject status: TDeferredStatus constructor () { this.promise = new Promise((resolve, reject) => { this.resolve = resolve this.reject = reject this.status = 'pending' }) } } export let defer = () => { return new Deferred() } /** * Creates a new resolved promise for the provided value. */ export let resolvedPromise = (value?: T): Promise => { return Promise.resolve(value) } /** * Creates a new rejected promise for the provided reason. */ export let rejectedPromise = (err) => { return Promise.reject(err) } export let promisify = util.promisify // polyfill if (!promisify) { promisify = require('util.promisify') } export let map = async (inputArg: T[],functionArg) => { let promisifedFunction = promisify(functionArg) let promiseArray: Promise[] = [] let resultArray = [] for (let item of inputArg) { let promise: Promise = promisifedFunction(item) promiseArray.push(promise) promise.then(x => { resultArray.push(x) }) } await Promise.all(promiseArray) return resultArray }