@tanstack/db-ivm
Version:
Incremental View Maintenance for TanStack DB based on Differential Dataflow
79 lines (78 loc) • 1.66 kB
JavaScript
import { MultiSet } from "./multiset.js";
class DifferenceStreamReader {
#queue;
constructor(queue) {
this.#queue = queue;
}
drain() {
const out = [...this.#queue].reverse();
this.#queue.length = 0;
return out;
}
isEmpty() {
return this.#queue.length === 0;
}
}
class DifferenceStreamWriter {
#queues = [];
sendData(collection) {
if (!(collection instanceof MultiSet)) {
collection = new MultiSet(collection);
}
for (const q of this.#queues) {
q.unshift(collection);
}
}
newReader() {
const q = [];
this.#queues.push(q);
return new DifferenceStreamReader(q);
}
}
class Operator {
constructor(id, inputs, output) {
this.id = id;
this.inputs = inputs;
this.output = output;
}
hasPendingWork() {
return this.inputs.some((input) => !input.isEmpty());
}
}
class UnaryOperator extends Operator {
constructor(id, inputA, output) {
super(id, [inputA], output);
this.id = id;
}
inputMessages() {
return this.inputs[0].drain();
}
}
class BinaryOperator extends Operator {
constructor(id, inputA, inputB, output) {
super(id, [inputA, inputB], output);
this.id = id;
}
inputAMessages() {
return this.inputs[0].drain();
}
inputBMessages() {
return this.inputs[1].drain();
}
}
class LinearUnaryOperator extends UnaryOperator {
run() {
for (const message of this.inputMessages()) {
this.output.sendData(this.inner(message));
}
}
}
export {
BinaryOperator,
DifferenceStreamReader,
DifferenceStreamWriter,
LinearUnaryOperator,
Operator,
UnaryOperator
};
//# sourceMappingURL=graph.js.map