2.0.9 • Published 3 months ago

@hazae41/cleaner v2.0.9

Weekly downloads
-
License
MIT
Repository
github
Last release
3 months ago

Cleaner

Helpers for Disposable

npm i @hazae41/cleaner

Node Package 📦

Features

Current features

  • 100% TypeScript and ESM
  • No external dependencies
  • Create a disposable object from any object
  • Create a thenable disposable object from a thenable object
  • Race multiple thenable and disposable objects

Usage

Create a disposable object (Disposable or AsyncDisposable) from any object

using d = new Disposer(something, () => { ... })
await using d = new AsyncDisposer(something, async () => { ... })

Create a thenable disposable object from a thenable object (PromiseLike)

using d = new PromiseDisposer(doSomethingAsync(), () => { ... })

await d
await using d = new AsyncPromiseDisposer(doSomethingAsync(), async () => { ... })

await d

Race multiple thenable and disposable objects (PromiseLike & Disposable)

It will dispose both a and b once one of them settles

/**
 * When a and b are Disposable
 **/
await Disposable.raceSync([a, b])
/**
 * When a and b are AsyncDisposable
 **/
await Disposable.race([a, b])

This can be useful for waiting for multiple listeners, and remove all listeners when one of them is triggered

function waitA(): PromiseLike<"a"> & Disposable {
  const future = new Future<"a">()
  const onevent = () => future.resolve("a")

  this.addEventListener("a", onevent)
  const off = () => this.removeEventListener("a", onevent)
  
  return new PromiseDisposer(future.promise, off)
}

function waitB(): PromiseLike<"b"> & Disposable {
  const future = new Future<"b">()
  const onevent = () => future.resolve()

  this.addEventListener("b", onevent)
  const off = () => this.removeEventListener("b", onevent)
  
  return new PromiseDisposer(future.promise, off)
}

/**
 * When one listener is triggered, the other is removed
 **/
const x: "a" | "b" = await Disposable.raceSync([waitA(), waitB()])
2.0.9

3 months ago

2.0.8

3 months ago

2.0.3

8 months ago

2.0.2

9 months ago

2.0.5

6 months ago

2.0.4

6 months ago

2.0.7

6 months ago

2.0.6

6 months ago

2.0.1

9 months ago

2.0.0

9 months ago

1.0.4

11 months ago

1.0.3

11 months ago

1.0.2

11 months ago

1.0.1

11 months ago

1.0.0

12 months ago