1.0.12 • Published 9 months ago

iter8or v1.0.12

Weekly downloads
-
License
MIT
Repository
github
Last release
9 months ago

Iter8or

npm version

Документация

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]

🔍 Подробнее о каждом методе класса Iter8or

🇬🇧 Switch to English

1.0.12

9 months ago

1.0.11

9 months ago

1.0.10

9 months ago

1.0.9

10 months ago

1.0.8

10 months ago

1.0.7

10 months ago

1.0.6

10 months ago

1.0.5

10 months ago

1.0.4

10 months ago

1.0.3

10 months ago

1.0.2

10 months ago

1.0.1

10 months ago

1.0.0

10 months ago