Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
Something went wrong. Try again.
1.9 kB · 73 lines
TypeScript
at debugStartup
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273import type {Mapper} from "p-map";import { sleep } from "../utils.ts";
/** https://stackoverflow.com/a/63795192/1469797 */export async function findAsyncSequential<T>( array: T[], predicate: (t: T) => Promise<boolean>,): Promise<T | undefined> { const i = await findIndexAsyncSequential(array, predicate); if(i === undefined) { return undefined; } return array[i];}
export async function findIndexAsyncSequential<T>( array: T[], predicate: (t: T) => Promise<boolean>,): Promise<number | undefined> { let index = 0; for (const t of array) { if (await predicate(t)) { return index; } index++; } return undefined;}
/** https://stackoverflow.com/a/55601090/1469797 */export async function findAsync<T>( array: T[], predicate: (t: T) => Promise<boolean>): Promise<T | undefined> { const i = await findIndexAsync(array, predicate); if(i === undefined) { return undefined; } return array[i];}
export async function findIndexAsync<T>( array: T[], predicate: (t: T) => Promise<boolean>): Promise<number | undefined> { const promises = array.map(predicate); const results = await Promise.all(promises); const index = results.findIndex(result => result); return index;}
export interface StaggerOptions { maxRandomStagger?: number, initialInterval?: number, concurrency: number }export function staggerMapper<Element, NewElement>(options: StaggerOptions) { const { initialInterval = 0, maxRandomStagger = 0, concurrency } = options; let initialStagger = 0;
return (mapper: Mapper<Element, NewElement>) => async (x: Element, index: number) => { if (index < concurrency) { await sleep(initialStagger); initialStagger += initialInterval; } else { const s = Math.min((Math.random() * 1000), maxRandomStagger) await sleep(s); } return await mapper(x, index); }}