🚀 Big News:Socket Has Acquired Secure Annex.Learn More
Socket
Book a DemoSign in
Socket

@monstermann/dsp

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@monstermann/dsp

Small & fast disposables.

latest
Source
npmnpm
Version
0.4.0
Version published
Weekly downloads
18
-61.7%
Maintainers
1
Weekly downloads
 
Created
Source

dsp

Minified Minzipped

Small & fast disposables.

Documentation

Example

import { Dsp } from "@monstermann/dsp";

const dspA = Dsp.create();
const dspB = Dsp.create();

Dsp.add(dspA, () => console.log(1));
Dsp.add(dspA, () => console.log(2));
Dsp.add(dspB, () => console.log(3));
Dsp.add(dspB, () => console.log(4));
Dsp.add(dspA, dspB);

Dsp.dispose(dspA); // Prints: 4, 3, 2, 1

Installation

npm install @monstermann/dsp
pnpm add @monstermann/dsp
yarn add @monstermann/dsp
bun add @monstermann/dsp

Benchmarks

Apple M1 Max, Node v24.0.1

bench-dispose-cbs

  • Setup: Create a disposable with N callbacks attached
  • Bench: Dispose above
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 133M23ns±0.07%43M
Dsp.dispose(dsp) x 1024M40ns±0.11%25M
Dsp.dispose(dsp) x 1004M237ns±0.07%4M
DisposableStack.dispose() x 122M51ns±0.07%20M
DisposableStack.dispose() x 104M245ns±0.07%4M
DisposableStack.dispose() x 100468K2µs±0.10%463K

bench-dispose-dsps-wide

  • Setup: Create a disposable with N other disposables attached
  • Bench: Dispose above
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 127M30ns±0.07%34M
Dsp.dispose(dsp) x 109M118ns±0.11%8M
Dsp.dispose(dsp) x 100986K1µs±4.23%877K
DisposableStack.dispose() x 112M83ns±0.07%12M
DisposableStack.dispose() x 102M569ns±0.08%2M
DisposableStack.dispose() x 100188K5µs±0.09%186K

bench-dispose-dsps-deep

  • Setup: Create a disposable with N other disposables attached, arranged as a chain
  • Bench: Dispose above
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 129M26ns±0.08%38M
Dsp.dispose(dsp) x 107M156ns±0.24%6M
Dsp.dispose(dsp) x 100682K2µs±3.65%634K
DisposableStack.dispose() x 113M83ns±0.07%12M
DisposableStack.dispose() x 101M783ns±0.07%1M
DisposableStack.dispose() x 100110K9µs±0.09%109K

bench-dispose-dsps-wide-reverse

  • Setup: Create a disposable with N other disposables attached
  • Bench: Dispose above in reverse order, one by one
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 129M26ns±0.08%38M
Dsp.dispose(dsp) x 107M155ns±1.19%6M
Dsp.dispose(dsp) x 100767K1µs±0.10%756K
DisposableStack.dispose() x 120M55ns±0.08%18M
DisposableStack.dispose() x 103M370ns±0.05%3M
DisposableStack.dispose() x 100294K3µs±0.05%293K

bench-dispose-dsps-deep-reverse

  • Setup: Create a disposable with N other disposables attached, arranged as a chain
  • Bench: Dispose above in reverse order, one by one
nameops/sectime/opmarginsamples
Dsp.dispose(dsp) x 124M40ns±0.04%25M
Dsp.dispose(dsp) x 105M223ns±0.06%4M
Dsp.dispose(dsp) x 100471K2µs±2.48%462K
DisposableStack.dispose() x 111M93ns±0.31%11M
DisposableStack.dispose() x 101M841ns±0.05%1M
DisposableStack.dispose() x 100103K10µs±0.06%103K
  • Setup: Create a disposable
  • Bench: Attach N callbacks to it
nameops/sectime/opmarginsamples
Dsp.add(dsp, callback) x 134M22ns±0.06%45M
Dsp.add(dsp, callback) x 1002M768ns±6.35%1M
Dsp.add(dsp, callback) x 1000158K7µs±1.56%137K
DisposableStack.adopt(undefined, callback) x 124M43ns±0.28%23M
DisposableStack.adopt(undefined, callback) x 100496K2µs±6.78%451K
DisposableStack.adopt(undefined, callback) x 100046K23µs±0.75%44K
  • Setup: Create a disposable
  • Bench: Attach N other disposables to it
nameops/sectime/opmarginsamples
Dsp.add(dsp, Dsp.create()) x 134M22ns±0.07%45M
Dsp.add(dsp, Dsp.create()) x 1002M762ns±7.31%1M
Dsp.add(dsp, Dsp.create()) x 1000162K7µs±2.75%137K
DisposableStack.use(new DisposableStack()) x 111M91ns±0.06%11M
DisposableStack.use(new DisposableStack()) x 100151K7µs±6.90%142K
DisposableStack.use(new DisposableStack()) x 100015K68µs±0.61%15K

bench-create

  • Bench: Creates N empty disposables
nameops/sectime/opmarginsamples
Dsp.create() x 136M21ns±0.08%48M
Dsp.create() x 10024M41ns±0.85%24M
Dsp.create() x 10003M340ns±0.07%3M
new DisposableStack() x 122M51ns±5.95%20M
new DisposableStack() x 100359K3µs±8.03%332K
new DisposableStack() x 100036K28µs±0.40%36K

memory

Heapsize for 1M instances:

  • Dsp.create(): 247.57 MB
  • new DisposableStack(): 299.39 MB

Tree-shaking

Installation

npm install -D @monstermann/unplugin-dsp
pnpm -D add @monstermann/unplugin-dsp
yarn -D add @monstermann/unplugin-dsp
bun -D add @monstermann/unplugin-dsp

Usage

// vite.config.ts
import dsp from "@monstermann/unplugin-dsp/vite";

export default defineConfig({
    plugins: [dsp()],
});
// rollup.config.js
import dsp from "@monstermann/unplugin-dsp/rollup";

export default {
    plugins: [dsp()],
};
// rolldown.config.js
import dsp from "@monstermann/unplugin-dsp/rolldown";

export default {
    plugins: [dsp()],
};
// webpack.config.js
const dsp = require("@monstermann/unplugin-dsp/webpack");

module.exports = {
    plugins: [dsp()],
};
// rspack.config.js
const dsp = require("@monstermann/unplugin-dsp/rspack");

module.exports = {
    plugins: [dsp()],
};
// esbuild.config.js
import { build } from "esbuild";
import dsp from "@monstermann/unplugin-dsp/esbuild";

build({
    plugins: [dsp()],
});

Dsp

add

function Dsp.add(disposer: Dsp, value: (() => void) | Dsp): DspLink | undefined;

Takes a Dsp instance and attaches a callback or another Dsp.

Returns a data-structure that can be passed to unlink for fast O(1) removals.

Returns undefined if:

  • The target Dsp has already been disposed
  • The provided Dsp has already been disposed
  • The target Dsp is equal to the provided Dsp

If the target Dsp is already disposed, the provided value will be immediately disposed if possible.

Example

import { Dsp } from "@monstermann/dsp";

const dspA = Dsp.create();
const dspB = Dsp.create();

Dsp.add(dspA, () => console.log(1));
Dsp.add(dspB, () => console.log(2));
Dsp.add(dspA, dspB);

Dsp.dispose(dspA); // Prints: 2, 1

Dsp.add(dspA, () => console.log(3)); // Prints: 3
Dsp.add(dspB, () => console.log(4)); // Prints: 4

create

function Dsp.create(): Dsp;

Creates a new Dsp instance.

Example

import { Dsp } from "@monstermann/dsp";

const dsp = Dsp.create();

Dispose

function Dsp.dispose(disposer: Dsp): void;

Takes a Dsp instance and disposes it, walking through all added values in reverse order (LIFO).

Disposed Dsps will dereference themselves from other Dsps.

Every added value is wrapped with a try/catch and errors are accumulated in an AggregateError.

Example

import { Dsp } from "@monstermann/dsp";

const dspA = Dsp.create();
Dsp.add(dspA, () => console.log(1));
Dsp.add(dspA, () => console.log(2));

Dsp.dispose(dspA); // Prints: 2, 1
import { Dsp } from "@monstermann/dsp";

const dspA = Dsp.create();
const dspB = Dsp.create();

Dsp.add(dspA, () => console.log(1));
Dsp.add(dspA, () => console.log(2));
Dsp.add(dspB, () => console.log(3));
Dsp.add(dspB, () => console.log(4));
Dsp.add(dspA, dspB);

Dsp.dispose(dspA); // Prints: 4, 3, 2, 1
import { Dsp } from "@monstermann/dsp";

const dspA = Dsp.create();
const dspB = Dsp.create();

Dsp.add(dspA, () => console.log(1));
Dsp.add(dspA, () => console.log(2));
Dsp.add(dspB, () => console.log(3));
Dsp.add(dspB, () => console.log(4));
Dsp.add(dspA, dspB);

Dsp.dispose(dspB); // Prints: 4, 3
Dsp.dispose(dspA); // Prints: 2, 1
import { Dsp } from "@monstermann/dsp";

const dspA = Dsp.create();

Dsp.add(dspA, () => console.log(1));
Dsp.add(dspA, () => console.log(2));
Dsp.add(dspA, () => {
    throw new Error();
});

Dsp.dispose(dspA); // Prints: 2, 1, then rethrows above error
import { Dsp } from "@monstermann/dsp";

const dspA = Dsp.create();

Dsp.add(dspA, () => console.log(1));
Dsp.add(dspA, () => console.log(2));
Dsp.add(dspA, () => {
    throw new Error();
});
Dsp.add(dspA, () => {
    throw new Error();
});

Dsp.dispose(dspA); // Prints: 2, 1, then throws AggregateError

find

function Dsp.find(disposer: Dsp, value: (() => void) | Dsp): DspLink | undefined;

O(n)

Takes a Dsp instance and finds the last occurrence of value, the result can be passed to unlink to remove it.

Example

import { Dsp } from "@monstermann/dsp";

const dsp = Dsp.create();

const cb1 = () => {};
const cb2 = () => {};

Dsp.add(dsp, cb1);

Dsp.includes(dsp, cb1); // true
Dsp.includes(dsp, cb2); // false

const l1 = Dsp.find(dsp, cb1); // link
const l2 = Dsp.find(dsp, cb2); // undefined

Dsp.unlink(l1);
Dsp.unlink(l2);

Dsp.includes(dsp, cb1); // false
Dsp.includes(dsp, cb2); // false

dspIncludes

function Dsp.includes(disposer: Dsp, value: (() => void) | Dsp): boolean;

O(n)

Returns a boolean indicating whether the provided Dsp instance includes value.

By default add does not check for duplicates, you can use this or find if you need to make sure there are none.

Example

import { Dsp } from "@monstermann/dsp";

const dsp = Dsp.create();
const cb = () => {};

Dsp.includes(dsp, cb); // false
const link = Dsp.add(dsp, cb);
Dsp.includes(dsp, cb); // true
Dsp.unlink(dsp, link);
Dsp.includes(dsp, cb); // false

isDisposed

function Dsp.isDisposed(disposer: Dsp): boolean;

Returns a boolean indicating whether the provided Dsp instance has been disposed.

Example

import { Dsp } from "@monstermann/dsp";

const dsp = Dsp.create();
Dsp.isDisposed(dsp); // false
Dsp.dispose(dsp);
Dsp.isDisposed(dsp); // true

isDsp

function Dsp.isDsp(value: unknown): value is Dsp;

Checks whether the provided value is a Dsp instance.

Example

import { Dsp } from "@monstermann/dsp";

const dsp = Dsp.create();
Dsp.isDsp(dsp); // true

remove

function Dsp.remove(disposer: Dsp, value: (() => void) | Dsp): void;

O(n)

Takes a Dsp instance and removes the last occurrence of value from it.

If you can, use unlink as it is O(1).

Example

import { Dsp } from "@monstermann/dsp";

const dsp = Dsp.create();
const cb = () => {};
const link = Dsp.add(dsp, cb);
Dsp.includes(dsp, cb); // true
Dsp.remove(dsp, cb);
Dsp.includes(dsp, cb); // false
function Dsp.unlink(link: DspLink | undefined): void;

O(1)

Takes a value constructed by add and destroys all references.

Example

import { Dsp } from "@monstermann/dsp";

const cb = () => {};

const dsp = Dsp.create();
const link = Dsp.add(dsp, cb);

Dsp.includes(dsp, cb); // true
Dsp.unlink(link);
Dsp.includes(dsp, cb); // false

FAQs

Package last updated on 15 Feb 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts