sflow
Version:
sflow is a powerful and highly-extensible library designed for processing and manipulating streams of data effortlessly. Inspired by the functional programming paradigm, it provides a rich set of utilities for transforming streams, including chunking, fil
80 lines (75 loc) • 2.79 kB
text/typescript
import { csvFormatBody, csvParse, tsvFormatBody, tsvParse } from "d3";
import type { Split } from "ts-toolbelt/out/String/Split";
import { lines } from "./lines";
import { maps } from "./maps";
import { skips } from "./skips";
import { throughs } from "./throughs";
export function csvFormats<S extends string>(
header: S,
): TransformStream<Record<Split<S, ",">[number], any>, string>;
export function csvFormats<S extends string[]>(
header: S,
): TransformStream<Record<S[number], any>, string>;
export function csvFormats(
header: string | string[],
): TransformStream<Record<string, any>, string> {
const _header = typeof header === "string" ? header.split(",") : header;
return new TransformStream({
start: (ctrl) => ctrl.enqueue(_header.join(",") + "\n"),
transform: (chunk, ctrl) =>
ctrl.enqueue(csvFormatBody([chunk], _header) + "\n"),
});
}
export function csvParses<S extends string>(
header: S,
): TransformStream<string, Record<Split<S, ",">[number], any>>;
export function csvParses<S extends string[]>(
header: S,
): TransformStream<string, Record<S[number], any>>;
export function csvParses(
header: string | string[],
): TransformStream<string, Record<string, any>> {
const _header = typeof header === "string" ? header.split(",") : header;
let i = 0;
return throughs<string, Record<string, any>>((r) =>
r
.pipeThrough(lines({ EOL: "LF" }))
.pipeThrough(skips(1))
.pipeThrough(maps((line) => csvParse(_header + "\n" + line)[0])),
);
}
export function tsvFormats<S extends string>(
header: S,
): TransformStream<Record<Split<S, "\t">[number], any>, string>;
export function tsvFormats<S extends string[]>(
header: S,
): TransformStream<Record<S[number], any>, string>;
export function tsvFormats(
header: string | string[],
): TransformStream<Record<string, any>, string> {
const sep = "\t";
const _header = typeof header === "string" ? header.split(sep) : header;
return new TransformStream({
start: (ctrl) => ctrl.enqueue(_header.join(sep) + "\n"),
transform: (chunk, ctrl) =>
ctrl.enqueue(tsvFormatBody([chunk], _header) + "\n"),
});
}
export function tsvParses<S extends string>(
header: S,
): TransformStream<string, Record<Split<S, "\t">[number], any>>;
export function tsvParses<S extends string[]>(
header: S,
): TransformStream<string, Record<S[number], any>>;
export function tsvParses(
header: string | string[],
): TransformStream<string, Record<string, any>> {
const _header = typeof header === "string" ? header.split("\t") : header;
let i = 0;
return throughs<string, Record<string, any>>((r) =>
r
.pipeThrough(lines({ EOL: "LF" }))
.pipeThrough(skips(1))
.pipeThrough(maps((line) => tsvParse(_header + "\n" + line)[0])),
);
}