Skip to content

Commit

Permalink
feat: add test/fix rangeiterator/update docs
Browse files Browse the repository at this point in the history
  • Loading branch information
TanyaLagodich committed Sep 1, 2024
1 parent 7aa01d6 commit 1b4214e
Show file tree
Hide file tree
Showing 11 changed files with 428 additions and 307 deletions.
28 changes: 24 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ Iter8or is a versatile library for working with iterators and asynchronous itera

- **Support for both synchronous and asynchronous iterators**: Process both synchronous and asynchronous data using a single API.
- **Creation of iterators from non-iterable objects:**:
- For numbers (`number`): By default, it creates an iterator that iterates from 1 to the specified number (range).
- `digits` option: If the `{ digits: true }` option is passed, the number is split into individual digits, creating an iterator over the digits of the number.
- For objects (`object`): An iterator is created that iterates over the keys and values of the object.
- For numbers (`number`):
- **By default**, an iterator is created that iterates from _1_ (or _-1_ if the number is negative) to the specified number inclusively (range).
- **The digits option**: If the `{ digits: true }` option is provided, the number is split into individual digits, creating an iterator over the digits of the number. This supports both regular numbers and `BigInt`.
- If a range iterator is used, the allowed range is _from -1e7 to 1e7_. This limitation is in place to prevent excessive memory and resource usage.
- **For objects (`object`)**: An iterator is created that iterates over the keys and values of the object.
- **Powerful data processing methods**: Built-in methods for filtering, mapping, grouping, splitting, combining, and other data operations.
- **Support for ES Modules and CommonJS**: The library can be used with both modern ES modules and traditional CommonJS modules.

## Installation

Expand Down Expand Up @@ -72,7 +75,24 @@ for await (const value of asyncIter) {
// 'cherry'
```

Numbers (`number`) are always processed as **_synchronous_** iterators, regardless of whether the `{ async: true }` option is passed or not.
## Important Notes on Numbers
- **The `digits: true` option**: Allows iterating over individual digits of a number, supporting both regular numbers and `BigInt`.
- Numbers (`number`) are always processed as **_synchronous_** iterators, regardless of whether the `{ async: true }` option is passed.

### Iteration Over Ranges (RangeIterable):
Range iterators (`range`) are limited to numbers **_from -1e7 to 1e7_**. This limitation is in place to prevent excessive memory and resource usage. If you try to create a range beyond these values, the library will throw a _RangeError_.

### Example with RangeIterable:
```javascript
const rangeIter = new Iter8or(5);
console.log([...rangeIter]); // [1, 2, 3, 4, 5]
```

### Example with BigInt and the digits: true Option:
```javascript
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]
```

[🔍 Learn more about each method of the Iter8or class](https://tanyalagodich.github.io/Iter8or/Iter8or.html)

Expand Down
29 changes: 24 additions & 5 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ Iter8or — это универсальная библиотека для раб

- **Поддержка синхронных и асинхронных итераторов**: Обрабатывайте как синхронные, так и асинхронные данные с помощью единого API.
- **Создание итераторов из неитерируемых объектов**:
- Для чисел (`number`): По умолчанию создается итератор, который проходит от 1 до указанного числа включительно (диапазон).
- Опция `digits`: Если передана опция `{ digits: true }`, число разбивается на отдельные разряды, создавая итератор по цифрам числа.
- Для объектов (`object`): Создается итератор, который проходит по ключам и значениям объекта.
- Для чисел (`number`):
- По умолчанию создается итератор, который проходит от _1_ (или _-1_, если передано число меньше 0) до указанного числа включительно (диапазон).
- Опция `digits`: Если передана опция `{ digits: true }`, число разбивается на отдельные разряды, создавая итератор по цифрам числа. Поддерживается как обычные числа, так и `BigInt`.
- Если используется итератор диапазона, можно передавать числа в пределах от _-1e7_ до _1e7_. Это ограничение введено для предотвращения чрезмерного использования памяти и ресурсов.
- Для объектов (`object`): Создается итератор, который проходит по ключам и значениям объекта.
- **Мощные методы обработки данных**: Встроенные методы для фильтрации, маппинга, группировки, разделения, объединения и других операций с данными.

- **Поддержка ES-модулей и CommonJS**: Библиотека может использоваться как с современными ES-модулями, так и с традиционными CommonJS-модулями.
## Установка

Установите библиотеку с помощью npm:
Expand Down Expand Up @@ -71,7 +73,24 @@ for await (const value of asyncIter) {
// 'cherry'
```

Цифры (`number`) всегда обрабатываются как **_синхронные_** итераторы, независимо от того, передана опция `{ async: true }` или нет.
## Важные замечания о числах
- **Опция `digits: true`:** Позволяет итерировать по отдельным цифрам числа, поддерживая как обычные числа, так и `BigInt`.
- Цифры (`number`) всегда обрабатываются как **_синхронные_** итераторы, независимо от того, передана опция `{ async: true }` или нет.

### Итерация по диапазонам (RangeIterable):
Итераторы диапазонов (`range`) ограничены числом **от -1e7 до 1e7**. Это ограничение введено для предотвращения чрезмерного использования памяти и ресурсов. Если пытаться создать диапазон за пределами этих значений, библиотека выбросит _RangeError_.

### Пример с диапазоном RangeIterable:
```javascript
const rangeIter = new Iter8or(5);
console.log([...rangeIter]); // [1, 2, 3, 4, 5]
```

### Пример с BigInt и опцией digits: true:
```javascript
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](https://tanyalagodich.github.io/Iter8or/ru/Iter8or.html)

Expand Down
7 changes: 6 additions & 1 deletion jsdoc-ru.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"source": {
"include": ["src"],
"includePattern": ".+\\.js$",
"includePattern": "core/docs/iter8or.ru.jsdoc.js",
"excludePattern": "(^|\\/|\\\\)node_modules"
},
"opts": {
Expand All @@ -19,6 +19,11 @@
"id": "github",
"link": "https://github.com/TanyaLagodich/Iter8or"
},
{
"title": "NPM",
"id": "npm",
"link": "https://www.npmjs.com/package/iter8or"
},
{
"title": "English Version",
"id": "en",
Expand Down
7 changes: 6 additions & 1 deletion jsdoc.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"source": {
"include": ["src"],
"includePattern": ".+\\.js$",
"includePattern": "/core/docs/iter8or.jsdoc.js",
"excludePattern": "(^|\\/|\\\\)node_modules"
},
"opts": {
Expand All @@ -19,6 +19,11 @@
"id": "github",
"link": "https://github.com/TanyaLagodich/Iter8or"
},
{
"title": "NPM",
"id": "npm",
"link": "https://www.npmjs.com/package/iter8or"
},
{
"title": "Русская версия",
"id": "ru",
Expand Down
31 changes: 18 additions & 13 deletions src/core/DigitsIterable.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,31 @@
export class DigitsIterable {
constructor(number) {
this.number = number;
if (typeof number === 'bigint' || number > Number.MAX_SAFE_INTEGER) {
this.number = BigInt(number);
} else {
this.number = number;
}
}

[Symbol.iterator]() {
let number = this.number;
return {
next() {
while (number > 0) {
const digit = number % 10;
number = Math.floor(number / 10);

return {
value: digit,
done: false,
};
if (typeof number === 'bigint') {
if (number > 0n) {
const digit = number % 10n;
number = number / 10n;
return { value: Number(digit), done: false };
}
} else {
if (number > 0) {
const digit = number % 10;
number = Math.floor(number / 10);
return { value: digit, done: false };
}
}

return {
done: true,
value: undefined,
};
return { done: true, value: undefined };
},
};
}
Expand Down
Loading

0 comments on commit 1b4214e

Please sign in to comment.