Возможно, вы знакомы с потоками 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 недостатка и, вероятно, много ошибок:
- Одно обновление, которое нужно сделать, заключается в том, что вместо удаления элементов из очереди из 𝚝𝚑𝚒𝚜.𝚟𝚊𝚕𝚜 в последнем методе мы должны просто использовать индекс. Таким образом, если для того же итерируемого объекта будет вызвана другая итерация, она будет воспроизводить те же значения (принцип наименьшего удивления).
- Действие фильтра на самом деле не происходит до самого конца, и более того, если filter вызываться до map, оно сломается, так что это и ошибка, и ошибка. задача дизайна для всего этого дизайна.
Код в основном работает, однако я не уверен, что из него выйдет что-то хорошее. Пожалуйста, критикуйте код и предлагайте идеи! Потоки приятные.