This library contains utilities for disposables as defined by the [`promise-toolbox` library](https://github.com/JsCommunity/promise-toolbox#resource-management). ### `deduped(fn, keyFn)` Creates a new function that wraps `fn` and instead of creating a new disposables at each call, returns copies of the same one when `keyFn` returns the same keys. Those copies contains the same value and can be disposed independently, the source disposable will only be disposed when all copies are disposed. `keyFn` is called with the same context and arguments as the wrapping function and must returns an array of keys which will be used to identify which disposables should be grouped together. ```js import { deduped } from '@vates/disposable/deduped' // the connection with the passed host will be established once at the first call, then, it will be shared with the next calls const getConnection = deduped(async function (host)) { const connection = new Connection(host) return new Disposabe(connection, () => connection.close()) }, host => [host]) ``` ### `debounceResource(disposable, delay)` Creates a new disposable with the same value and with a delayed disposer. On calling this disposer, the source disposable will be disposed when the `delay` is passed. ```js import { createDebounceResource } from '@vates/disposable/debounceResource' const debounceResource = createDebounceResource() // it will wait for 10 seconds before calling the disposer Disposable.use(debounceResource(getConnection(host), 10e3), connection => {}) ``` ### `debounceResource.flushAll()` Disposes all delayed disposers and cancels the delaying of the disposables that are in usage. ```js import { createDebounceResource } from '@vates/disposable/debounceResource' const debounceResource = createDebounceResource() const res1 = await debounceResource(res, 10e3) const res2 = await debounceResource(res, 10e3) const res3 = await debounceResource(res, 10e3) rest1.dispose() rest2.dispose() // res3 is in usage debounceResource.flushAll() // res1 and res2 are immediately disposed // res3 will be disposed immediately when its disposer will be called ```