import type { Ord } from "rambda"; /** chunk items by compareFn, group items with same Ord */ export function chunkBys(compareFn: (x: T) => Ord) { let chunks: T[] = []; let lastOrder: Ord; return new TransformStream({ transform: async (chunk, ctrl) => { const order = compareFn(chunk); if (lastOrder && lastOrder !== order) ctrl.enqueue(chunks.splice(0, Infinity)); // clear chunks; chunks.push(chunk); lastOrder = order; }, flush: async (ctrl) => void (chunks.length && ctrl.enqueue(chunks)), }); }