Возник спор по поводу того как лучше реализовать метод printStream. Какую реализацию в код вставишь, а какую в корзину отправишь?
1) Дедовский подход:
async function printStream(stream) {
let line = '';
for await (let chunk of stream) {
chunk = chunk.toString();
while (chunk.length) {
const i = chunk.indexOf('\n');
if (i === -1) {
line += chunk;
break;
}
line += chunk.slice(0, i);
console.log(line.trim());
line = '';
chunk = chunk.slice(i + 1);
}
}
}
2) Хипстерский, на генераторах:
async function printStream(stream) {
await pipe(
stream,
toString,
chunksToLines,
trim,
print,
);
}
function pipe(value, ...fns) {
let result = value;
for (const fn of fns) {
result = fn(result);
}
return result;
}
async function *toString(chunks) {
for await (const chunk of chunks) {
yield chunk.toString();
}
}
async function *chunksToLines(chunks) {
let previous = '';
for await (const chunk of chunks) {
previous += chunk;
while (true) {
const i = previous.indexOf('\n');
if (i < 0) {
break;
}
yield previous.slice(0, i + 1);
previous = previous.slice(i + 1);
}
}
if (previous.length > 0) {
yield previous;
}
}
async function *trim(values) {
for await (const value of values) {
yield value.trim();
}
}
async function print(values) {
for await (const value of values) {
console.log(value);
}
}