@thi.ng/transducers
Version:
Collection of ~170 lightweight, composable transducers, reducers, generators, iterators for functional data transformations
31 lines (30 loc) • 803 B
JavaScript
import { binarySearch } from "@thi.ng/arrays/binary-search";
import { __drain } from "./internal/drain.js";
import { __sortOpts } from "./internal/sort-opts.js";
import { __iter, iterator } from "./iterator.js";
function streamSort(...args) {
const iter = __iter(streamSort, args, iterator);
if (iter) {
return iter;
}
const { key, compare } = __sortOpts(args[1]);
const n = args[0];
return ([init, complete, reduce]) => {
const buf = [];
return [
init,
__drain(buf, complete, reduce),
(acc, x) => {
const idx = binarySearch(buf, x, key, compare);
buf.splice(idx < 0 ? -(idx + 1) : idx, 0, x);
if (buf.length === n) {
acc = reduce(acc, buf.shift());
}
return acc;
}
];
};
}
export {
streamSort
};