npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

derivation

v0.1.2

Published

A simple IVM (Incremental View Maintenence) library inspired by DBSP (Database Stream Processor).

Downloads

301

Readme

Derivation

This is a work in progress. Don't use this for anything you care about yet.

A simple TypeScript library for building incremental and reactive dataflow systems, loosely inspired by DBSP (Database Stream Processor) and differential dataflow.

🚀 Installation

npm install derivation

🕒 Global Time and Coordination

Unlike other reactive frameworks, derivation uses a global time that advances in discrete steps. This means that, if you want to look at two values, you don't need to worry about whether only one of them has updated, because they are all kept in lock-step and they are updated in topological order (dependencies before dependents).

const graph = new Graph();
const a = graph.inputValue(0);
const b = graph.inputValue(1);

const derived = a.zip(b, ([x, y]) => x + y);

// We need to hold a reference to the sink so that it doesn't get garbage collected
const sink = derived.sink((x) => console.log(x)); // outputs 1

a.push(7);
b.push(3);

// Pushing values doesn't trigger a global step. Only calling step will do that.
graph.step(); // outputs 10

🧹 Garbage Collection

The graph has only weak references to its reactive values, but derived values have strong references to their dependencies. When a derived value becomes unreachable, it will naturally drop out of the update loop.

If you want to stop updates manually, call:

value.dispose();

✨ Types

There are three main kinds of reactive thing:

  • ReactiveValue<T> is the type for things that update all at once. This is useful for primitive types like strings and numbers. These are the building blocks which more interesting things are built on top of,
  • ReactiveSet<T> holds a multiset which changes over time. Under the hood, operations on ReactiveSets are computed based on the deltas between versions, rather than on their materialized values,
  • ReactiveMap<K, V> is much like ReactiveSet. You can think of it like a ReactiveSet with an index.