iter8or
v1.0.12
Published
A versatile library for working with iterators and asynchronous iterators in JavaScript. It provides powerful methods for processing, filtering, combining, and transforming data, and even allows the creation of iterators from non-iterable objects.
Downloads
29
Maintainers
Readme
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]