Iter8or
Iter8or — это универсальная библиотека для работы с итераторами и асинхронными итераторами в JavaScript. Она предоставляет мощные методы для обработки, фильтрации, объединения и преобразования данных, а также позволяет создавать итераторы даже из неитерируемых объектов.
Особенности
- Поддержка синхронных и асинхронных итераторов: Обрабатывайте как синхронные, так и асинхронные данные с помощью единого API.
- Поддержка функций-генераторов: Поддержка как синхронных, так и асинхронных функций-генераторов. Функция будет вызвана автоматически, и возвращаемый генератор будет использоваться для итерации.
- Создание итераторов из неитерируемых объектов:
- Для чисел (
number
):- По умолчанию создается итератор, который проходит от 1 (или -1, если передано число меньше 0) до указанного числа включительно (диапазон).
- Опция
digits
: Если передана опция{ digits: true }
, число разбивается на отдельные разряды, создавая итератор по цифрам числа. Поддерживается как обычные числа, так иBigInt
. - Если используется итератор диапазона, можно передавать числа в пределах от -(2 ** 32 - 1) до 2 ** 32 - 1. Это ограничение введено для предотвращения чрезмерного использования памяти и ресурсов.
- Для объектов (
object
): Создается итератор, который проходит по ключам и значениям объекта.
- Для чисел (
- Мощные методы обработки данных: Встроенные методы для фильтрации, маппинга, группировки, разделения, объединения и других операций с данными.
- Поддержка ES-модулей и CommonJS: Библиотека может использоваться как с современными ES-модулями, так и с традиционными CommonJS-модулями.
Установка
Установите библиотеку с помощью npm:
npm install iter8or
Пример использования
с массивом
import Iter8or from 'iter8or';
const iter = new Iter8or([1, 2, 3]);
const mapped = iter.map(x => x * 2);
console.log([...mapped]); // [2, 4, 6]
с числом
const rangeIter = new Iter8or(3);
console.log([...rangeIter]); // [1, 2, 3]
с числом и опцией digits
const digitsIter = new Iter8or(12345, { digits: true });
console.log([...digitsIter]); // [1, 2, 3, 4, 5]
с объектом
const objIter = new Iter8or({ a: 1, b: 2 });
for (const [key, value] of objIter) {
console.log(key, value);
}
// a 1
// b 2
с функциями-генераторами
function* generatorFunction() {
yield 1;
yield 2;
yield 3;
}
const iter = new Iter8or(generatorFunction);
console.log([...iter]); // [1, 2, 3]
с асинхронными генераторами
async function* asyncGeneratorFunction() {
yield 1;
yield 2;
yield 3;
}
const iter = new Iter8or(asyncGeneratorFunction, { async: true });
(async () => {
for await (const value of iter) {
console.log(value); // 1, 2, 3
}
})();
Работа с асинхронными итераторами
Чтобы использовать асинхронные итераторы, необходимо передать опцию { async: true }
в конструктор. Это позволит корректно обработать асинхронные данные с использованием await
. В противном случае итератор будет обрабатываться как синхронный. Например:
const asyncIter = new Iter8or([
async () => 'apple',
async () => 'banana',
async () => 'cherry'
], { async: true });
for await (const value of asyncIter) {
console.log(value);
}
// 'apple'
// 'banana'
// 'cherry'
Важные замечания о числах
- Опция
digits: true
: Позволяет итерировать по отдельным цифрам числа, поддерживая как обычные числа, так иBigInt
. - Цифры (
number
) всегда обрабатываются как синхронные итераторы, независимо от того, передана опция{ async: true }
или нет. - Отрицательные числа при digits: true: Знак отбрасывается, и число обрабатывается как положительное.
- Числа с плавающей точкой не поддерживаются при
digits: true
: Такие числа приводят к выбросу исключения RangeError.
Итерация по диапазонам (RangeIterable):
Итераторы диапазонов (range) ограничены числами от -(2^53 - 1) до 2^53 - 1 (что соответствует значению Number.MAX_SAFE_INTEGER). Это ограничение гарантирует, что диапазон может быть обработан без ошибок потери точности. Если вы попытаетесь создать диапазон за пределами этих значений, библиотека выбросит исключение RangeError.
- Внимание: При работе с очень большими диапазонами использование оператора spread (например, ...rangeIter) может привести к проблемам с памятью и производительностью. Вместо этого рекомендуется вручную обрабатывать большие диапазоны в цикле, чтобы избежать переполнения памяти:
const largeRangeIter = new Iter8or(1000000000); // Очень большой диапазон
for (let num of largeRangeIter) {
// Обрабатываем каждое число
if (num > 100) break; // Пример: Останавливаемся после обработки первых 100 чисел
}
Пример с диапазоном RangeIterable:
const rangeIter = new Iter8or(5);
console.log([...rangeIter]); // [1, 2, 3, 4, 5]
Пример с BigInt и опцией digits: true:
const bigIntIter = new Iter8or(12345678901234567890n, { digits: true });
console.log([...bigIntIter]); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]