{"version":3,"file":"loop.mjs","sources":["../../../../../src/mods/loop/loop.ts"],"sourcesContent":["\nexport type Looper<T> =\n  (index: number) => Promise<T>\n\nexport class TooManyRetriesError extends Error {\n  readonly #class = TooManyRetriesError\n  readonly name = this.#class.name\n\n  constructor(options?: ErrorOptions) {\n    super(`Too many retries`, options)\n  }\n\n  static from(cause: unknown) {\n    return new TooManyRetriesError({ cause })\n  }\n\n}\n\nexport type Looped<T> =\n  | Cancel<T>\n  | Retry<T>\n  | Skip<T>\n\nexport namespace Looped {\n\n  export type Infer<T> =\n    | Cancel.Infer<T>\n    | Skip.Infer<T>\n    | Retry.Infer<T>\n\n  export type Inner<T> =\n    | Cancel.Inner<T>\n    | Skip.Inner<T>\n    | Retry.Inner<T>\n\n}\n\nexport class Cancel<T> {\n\n  constructor(\n    readonly inner: T\n  ) { }\n\n  static new<T>(inner: T) {\n    return new Cancel(inner)\n  }\n\n  isCancel(): this is Cancel<T> {\n    return true\n  }\n\n  isRetry(): false {\n    return false\n  }\n\n  isSkip(): false {\n    return false\n  }\n\n}\n\nexport namespace Cancel {\n\n  export type Infer<T> = Cancel<Inner<T>>\n\n  export type Inner<T> = T extends Cancel<infer Inner> ? Inner : never\n\n}\n\nexport class Retry<T> {\n\n  constructor(\n    readonly inner: T\n  ) { }\n\n  static new<T>(inner: T) {\n    return new Retry(inner)\n  }\n\n  isCancel(): false {\n    return false\n  }\n\n  isRetry(): this is Retry<T> {\n    return true\n  }\n\n  isSkip(): false {\n    return false\n  }\n\n}\n\nexport namespace Retry {\n\n  export type Infer<T> = Retry<Inner<T>>\n\n  export type Inner<T> = T extends Retry<infer Inner> ? Inner : never\n\n  export function runSync<T>(f: () => T) {\n    try {\n      return f()\n    } catch (error) {\n      throw new Retry(error)\n    }\n  }\n\n  export async function run<T>(f: () => Promise<T>) {\n    try {\n      return await f()\n    } catch (error) {\n      throw new Retry(error)\n    }\n  }\n\n}\n\nexport class Skip<T> {\n\n  constructor(\n    readonly inner: T\n  ) { }\n\n  static new<T>(inner: T) {\n    return new Skip(inner)\n  }\n\n  isCancel(): false {\n    return false\n  }\n\n  isRetry(): false {\n    return false\n  }\n\n  isSkip(): this is Skip<T> {\n    return true\n  }\n\n}\n\nexport namespace Skip {\n\n  export type Infer<T> = Skip<Inner<T>>\n\n  export type Inner<T> = T extends Skip<infer Inner> ? Inner : never\n\n  export function runSync<T>(f: () => T) {\n    try {\n      return f()\n    } catch (error) {\n      throw new Skip(error)\n    }\n  }\n\n  export async function run<T>(f: () => Promise<T>) {\n    try {\n      return await f()\n    } catch (error) {\n      throw new Skip(error)\n    }\n  }\n\n}\n\nexport interface LoopOptions {\n  readonly init?: number\n  readonly base?: number\n  readonly max?: number\n}\n\nexport async function loopOrThrow<T>(\n  looper: Looper<T>,\n  options: LoopOptions = {}\n) {\n  const { init = 1000, base = 2, max = 3 } = options\n\n  const errors = new Array<unknown>()\n\n  for (let i = 0; i < max; i++) {\n    try {\n      return await looper(i)\n    } catch (error) {\n      if (error instanceof Cancel)\n        throw error.inner\n\n      if (error instanceof Skip) {\n        errors.push(error)\n        continue\n      }\n\n      if (error instanceof Retry) {\n        errors.push(error)\n        await new Promise(ok => setTimeout(ok, init * (base ** i)))\n        continue\n      }\n\n      throw error\n    }\n  }\n\n  throw TooManyRetriesError.from(errors)\n}"],"names":[],"mappings":"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"}