# extra-defer

> ```sh npm install --save extra-defer # or yarn add extra-defer ```

Latest version **0.3.1** (published 2024-08-16) · MIT license · 0 weekly downloads

## Install

```sh
npm install extra-defer
pnpm add extra-defer
yarn add extra-defer
bun add extra-defer
```

## Health

**Score 40/100 (D)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads; pre 1.0.

Negative: abandoned.

## Facts

| | |
|---|---|
| Version | 0.3.1 |
| Published | 2024-08-16 |
| First published | 2022-02-21 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=18.17.0 |
| Dependencies | 4 |
| Unpacked size | 36 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | BlackGlory |
| Maintainers | black_glory |

## Links

- npm: https://www.npmjs.com/package/extra-defer
- Repository: https://github.com/BlackGlory/extra-defer
- Homepage: https://github.com/BlackGlory/extra-defer#readme
- Issues: https://github.com/BlackGlory/extra-defer/issues
- npm.io page: https://npm.io/package/extra-defer

## Dependencies (4)

- [extra-promise](https://npm.io/package/extra-promise.md) ^6.2.0
- [@blackglory/go](https://npm.io/package/@blackglory/go.md) ^2.0.0
- [extra-generator](https://npm.io/package/extra-generator.md) ^0.5.9
- [@blackglory/prelude](https://npm.io/package/@blackglory/prelude.md) ^0.3.5

## Recent versions

- 0.3.1 (latest) — 2024-08-16
- 0.3.0 — 2024-04-17
- 0.2.8 — 2023-06-10
- 0.2.7 — 2022-12-21
- 0.2.6 — 2022-12-21
- 0.2.5 — 2022-09-17
- 0.2.4 — 2022-08-06
- 0.2.3 — 2022-08-01
- 0.2.2 — 2022-04-23
- 0.2.1 — 2022-04-23
- 0.2.0 — 2022-02-21

## README

# extra-defer
## Install
```sh
npm install --save extra-defer
# or
yarn add extra-defer
```

## Usage
```ts
import { Destructor } from 'extra-defer'

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

## API
### Constructor
```ts
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
```ts
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
```ts
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
```ts
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
```ts
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
```ts
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
```ts
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
```ts
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`.

---
_Source: https://npm.io/package/extra-defer · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
