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;
};