@electric-sql/d2mini
Version:
D2Mini is a minimal implementation of Differential Dataflow for performing in-memory incremental view maintenance.
37 lines • 1.39 kB
JavaScript
import { DifferenceStreamWriter } from '../graph.js';
import { StreamBuilder } from '../d2.js';
import { ReduceOperator } from './reduce.js';
import { hash } from '../utils.js';
/**
* Operator that removes duplicates by key (version-free)
*/
export class DistinctOperator extends ReduceOperator {
constructor(id, inputA, output) {
const distinctInner = (vals) => {
const consolidated = new Map();
const values = new Map();
for (const [val, diff] of vals) {
const key = hash(val);
consolidated.set(key, (consolidated.get(key) || 0) + diff);
values.set(key, val);
}
return Array.from(consolidated.entries())
.filter(([_, count]) => count > 0)
.map(([key, _]) => [values.get(key), 1]);
};
super(id, inputA, output, distinctInner);
}
}
/**
* Removes duplicates by key (version-free)
*/
export function distinct() {
return (stream) => {
const output = new StreamBuilder(stream.graph, new DifferenceStreamWriter());
const operator = new DistinctOperator(stream.graph.getNextOperatorId(), stream.connectReader(), output.writer);
stream.graph.addOperator(operator);
stream.graph.addStream(output.connectReader());
return output;
};
}
//# sourceMappingURL=distinct.js.map