import {Resolvable, map} from '.'; let lockObjectToPromiseMapping = new Map>(); export type LockHandler = () => Resolvable; async function _lock(object: any, handler: LockHandler): Promise { try { await lockObjectToPromiseMapping.get(object); } catch (error) {} return handler(); } /** * A simple asynchronous lock that helps queueing operations. */ export async function lock( object: any, handler: LockHandler, ): Promise { let ret = _lock(object, handler); lockObjectToPromiseMapping.set(object, ret); return ret; } export type ParallelHandler = ( value: T, index: number, values: T[], ) => Resolvable; /** * Run tasks in parallel, similar to `v.map` but not mean to transform. */ export async function parallel( values: T[], handler: ParallelHandler, concurrency?: number, ): Promise { await map(values, handler, concurrency); } export type RaceTransformer = ( value: T, index: number, values: T[], ) => Resolvable; /** * Race tasks and fulfill or reject as soon as one of them fulfills or rejects. */ export async function race( values: T[], transformer: RaceTransformer, ): Promise { return Promise.race(values.map(transformer)); }