Skip to content

BlackGlory/extra-defer

Repository files navigation

extra-defer

Install

npm install --save extra-defer
# or
yarn add extra-defer

Usage

import { Destructor } from 'extra-defer'

const destructor = new Destructor()
try {
  const handle = open()
  destructor.defer(() => handle.close())
  // ...
} finally {
  await destructor.execute()
}

API

Constructor

class Constructor<Args extends unknown[] = []> {
  get size(): number

  constructor(options?: { autoClear?: boolean = true })

  defer(callback: (...args: Args) => Awaitable<unknown>): void
  remove(callback: (...args: Args) => Awaitable<unknown>): void
  clear(): void

  execute(...args: Args): Promise<void>
  executeSettled(...args: Args): Promise<void>

  all(concurrency: number = Infinity, ...args: Args): Promise<void>
  allSettled(concurrency: number = Infinity, ...args: Args): Promise<void>
}

Callbacks are executed in same order of defer.

Destructor

class Destructor<Args extends unknown[] = []> {
  get size(): number

  constructor(options?: { autoClear?: boolean = true })

  defer(callback: (...args: Args) => Awaitable<unknown>): void
  remove(callback: (...args: Args) => Awaitable<unknown>): void
  clear(): void

  execute(...args: Args): Promise<void>
  executeSettled(...args: Args): Promise<void>

  all(concurrency: number = Infinity, ...args: Args): Promise<void>
  allSettled(concurrency: number = Infinity, ...args: Args): Promise<void>
}

Callbacks are executed in reverse order of defer.

SyncConstructor

class SyncConstructor<Args extends unknown[] = []> {
  get size(): number

  constructor(options?: { autoClear?: boolean = true })

  defer(callback: (...args: Args) => unknown): void
  remove(callback: (...args: Args) => unknown): void
  clear(): void

  execute(...args: Args): void
  executeSettled(...args: Args): void
}

Callbacks are executed in same order of defer.

SyncDestructor

class SyncDestructor<Args extends unknown[] = []> {
  get size(): number

  constructor(options?: { autoClear?: boolean = true })

  defer(callback: (...args: Args) => unknown): void
  remove(callback: (...args: Args) => unknown): void
  clear(): void

  execute(...args: Args): void
  executeSettled(...args: Args): void
}

Callbacks are executed in reverse order of defer.

GeneratorConstructor

type ICallback<Yield, Next, Args extends unknown[]> = (...args: Args) =>
| void
| Generator<Yield, void, Next>

class GeneratorConstructor<Yield = unknown, Next = unknown, Args extends unknown[] = []> {
  get size(): number

  constructor(options?: { autoClear?: boolean = true })

  defer(callback: ICallback<Yield, Next, Args>): void
  remove(callback: ICallback<Yield, Next, Args>): void
  clear(): void

  execute(...args: Args): Generator<Yield, void, Next>
  executeSettled(...args: Args): Generator<Yield, void, Next>
}

Callbacks are executed in same order of defer.

GeneratorDestructor

type ICallback<Yield, Next, Args extends unknown[]> = (...args: Args) =>
| void
| Generator<Yield, void, Next>

class GeneratorDestructor<Yield = unknown, Next = unknown, Args extends unknown[] = []> {
  get size(): number

  constructor(options?: { autoClear?: boolean = true })

  defer(callback: ICallback<Yield, Next, Args>): void
  remove(callback: ICallback<Yield, Next, Args>): void
  clear(): void

  execute(...args: Args): Generator<Yield, void, Next>
  executeSettled(...args: Args): Generator<Yield, void, Next>
}

Callbacks are executed in reverse order of defer.

AsyncGeneratorConstructor

type ICallback<Yield, Next, Args extends unknown[]> = (...args: Args) =>
| void
| Generator<Yield, void, Next>
| AsyncGenerator<Yield, void, Next>

class AsyncGeneratorConstructor<
  Yield = unknown
, Next = unknown
, Args extends unknown[] = []
> {
  get size(): number

  constructor(options?: { autoClear?: boolean = true })

  defer(callback: ICallback<Yield, Next, Args>): void
  remove(callback: ICallback<Yield, Next, Args>): void
  clear(): void

  execute(...args: Args): AsyncGenerator<Yield, void, Next>
  executeSettled(...args: Args): AsyncGenerator<Yield, void, Next>
}

Callbacks are executed in same order of defer.

AsyncGeneratorDestructor

type ICallback<Yield, Next, Args extends unknown[]> = (...args: Args) =>
| void
| Generator<Yield, void, Next>
| AsyncGenerator<Yield, void, Next>

class AsyncGeneratorDestructor<Yield = unknown, Next = unknown, Args extends unknown[] = []> {
  get size(): number

  constructor(options?: { autoClear?: boolean = true })

  defer(callback: ICallback<Yield, Next, Args>): void
  remove(callback: ICallback<Yield, Next, Args>): void
  clear(): void

  execute(...args: Args): AsyncGenerator<Yield, void, Next>
  executeSettled(...args: Args): AsyncGenerator<Yield, void, Next>
}

Callbacks are executed in reverse order of defer.