JSFiddle - React, Tailwind, and code Playground
by Qwerty_Wasd
JavaScript
//генератор, возвращающий строки текста по одной
function *eachline(s) {
let p;
while((p = s.indexOf('\n')) != -1) {
yield s.substring(0, p);
s = s.substring(p + 1);
}
if(s.length > 0)
yield s;
}
//функция-генератор, возвращающая f(x) для каждого элемента x интерируемого объекта
function *map(i, f) {
for(let x in i)
yield f(x);
}
//функция-генератор, возвращающая элементы i, для которых f(x) возвращает true
function *select(i, f) {
for(let x in i) {
if(f(x))
yield x;
}
}
//обрабатываемый текст
let text = " #comment \n \n hello \nworld\n quit \n unreached \n";
//сконструировать конвейер генераторов для обработки текста
//сперва разбить текст на строки
let lines = eachline(text);
console.log(lines);
//затем удалить начальные и конечные пробелы в каждой строке
let trimmed = map(
lines,
function(line) {
return line.trim();
});
console.log(trimmed);
//наконец, игнорировать пустые строки и комментарии
let nonblank = select(
trimmed,
function(line) {
return line.length > 0 && line[0] != "#";
});
console.log(nonblank);
//теперьь извлечь отфильтрованные строки из конвейера и обработать их, остановиться, если встретиться строка "quit"
for(let line in nonblank) {
console.log(line);
if(line === "quit") break;
};