Возможно, вы знакомы с потоками RxJS и Node.js. Лично я, после все большего и большего использования генераторов и итерируемых объектов в последние недели, начал замечать некоторые преимущества потокового поведения в итерируемых объектах.

Я понял, что 𝚝𝚘𝚝𝚢𝚙𝚎.𝚖𝚊𝚙 может использовать больше памяти, чем потоки, поскольку они буферизуют целые массивы. Почему бы не реализовать filter и map с итерируемыми объектами и использовать функции потоковой передачи вместо буферизации.

Таким образом, «forEach», антифункциональная парадигма, в конце концов, не была такой уж злой, пока мы использовали ее для ввода-вывода, где ее можно было использовать в качестве источника для потока.

Например:

// with an array called "list":

list.forEach(v => {
   strm.write(v);
});

// or with iterables:

for(const v of x.iter()){
    strm.write(v);
}

И помните, что интерфейс для Iterable в JavaScript очень прост, это один метод 𝚗𝚎𝚡𝚝(…args), который возвращает объект, расширяющий интерфейс {𝚍𝚘𝚗𝚎: 𝚋𝚘𝚘𝚕𝚎𝚊𝚗, 𝚟𝚊𝚕𝚞𝚎: 𝚊𝚗𝚢}. Как многие отмечали, интерфейсы с одним методом — очень мощные конструкции в программном обеспечении.

Например, здесь:

class MyIterable {

  val = 1;

  [Symbol.iterator]() {
    return {
      next: () => { 
        return {
          done: this.val > 3,
          value: this.val++
        }
      }
    }
  }
}

for(const v of new MyIterable()){
  console.log(v);
}

Итак, мы пытаемся добавить карту/фильтр в Iterable. Вот ужасный ужасный код, который получается:

Оказывается, подключение итерируемых объектов похоже на написание пользовательских Observables с помощью RxJS.

В приведенном выше коде есть как минимум 2 недостатка и, вероятно, много ошибок:

  1. Одно обновление, которое нужно сделать, заключается в том, что вместо удаления элементов из очереди из 𝚝𝚑𝚒𝚜.𝚟𝚊𝚕𝚜 в последнем методе мы должны просто использовать индекс. Таким образом, если для того же итерируемого объекта будет вызвана другая итерация, она будет воспроизводить те же значения (принцип наименьшего удивления).
  2. Действие фильтра на самом деле не происходит до самого конца, и более того, если filter вызываться до map, оно сломается, так что это и ошибка, и ошибка. задача дизайна для всего этого дизайна.

Код в основном работает, однако я не уверен, что из него выйдет что-то хорошее. Пожалуйста, критикуйте код и предлагайте идеи! Потоки приятные.