You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
416 lines
8.3 KiB
416 lines
8.3 KiB
3 years ago
|
[](https://github.com/Yomguithereal/obliterator/actions)
|
||
|
|
||
|
# Obliterator
|
||
|
|
||
|
Obliterator is a dead simple JavaScript/TypeScript library providing miscellaneous higher-order iterator/iterable functions such as combining two or more iterators into a single one.
|
||
|
|
||
|
Note that when possible, `obliterator` also consider sequences such as arrays, strings etc. as valid iterables (although they are not proper ES6 iterables values), for convenience.
|
||
|
|
||
|
# Installation
|
||
|
|
||
|
```
|
||
|
npm install --save obliterator
|
||
|
```
|
||
|
|
||
|
Note that `obliterator` comes along with its TypeScript declarations.
|
||
|
|
||
|
# Usage
|
||
|
|
||
|
## Summary
|
||
|
|
||
|
_Classes_
|
||
|
|
||
|
- [Iterator](#iterator)
|
||
|
|
||
|
_Functions_
|
||
|
|
||
|
- [chain](#chain)
|
||
|
- [combinations](#combinations)
|
||
|
- [consume](#consume)
|
||
|
- [every](#every)
|
||
|
- [filter](#filter)
|
||
|
- [find](#find)
|
||
|
- [forEach](#foreach)
|
||
|
- [forEachWithNullKeys](#foreachwithnullkeys)
|
||
|
- [includes](#includes)
|
||
|
- [iter](#iter)
|
||
|
- [map](#map)
|
||
|
- [match](#match)
|
||
|
- [permutations](#permutations)
|
||
|
- [powerSet](#powerSet)
|
||
|
- [some](#some)
|
||
|
- [split](#split)
|
||
|
- [take](#take)
|
||
|
|
||
|
## Iterator
|
||
|
|
||
|
A handy Iterator class easily usable with ES2015's `for ... of` loop constructs & spread operator.
|
||
|
|
||
|
```js
|
||
|
import Iterator from 'obliterator/iterator';
|
||
|
// Or
|
||
|
import {Iterator} from 'obliterator';
|
||
|
|
||
|
const iterator = new Iterator(function () {
|
||
|
// Define what the `next` function does
|
||
|
return {done: false, value: 34};
|
||
|
});
|
||
|
|
||
|
// Checking that the given value is an iterator (native or else)
|
||
|
Iterator.is(value);
|
||
|
|
||
|
// Creating an empty iterator
|
||
|
const emptyIterator = Iterator.empty();
|
||
|
|
||
|
// Creating a simple iterator from a single value
|
||
|
const simpleIterator = Iterator.of(34);
|
||
|
|
||
|
// Creating a simple iterator from multiple values
|
||
|
const multipleIterator = Iterator.of(1, 2, 3);
|
||
|
```
|
||
|
|
||
|
## chain
|
||
|
|
||
|
Variadic function chaining all the given iterable-like values.
|
||
|
|
||
|
```js
|
||
|
import chain from 'obliterator/chain';
|
||
|
// Or
|
||
|
import {chain} from 'obliterator';
|
||
|
|
||
|
const set1 = new Set('a');
|
||
|
const set2 = new Set('bc');
|
||
|
|
||
|
const chained = chain(set1.values(), set2);
|
||
|
|
||
|
chained.next();
|
||
|
>>> {done: false, value: 'a'}
|
||
|
chained.next();
|
||
|
>>> {done: false, value: 'b'}
|
||
|
```
|
||
|
|
||
|
## combinations
|
||
|
|
||
|
Returns an iterator of combinations of the given array and of the given size.
|
||
|
|
||
|
Note that for performance reasons, the yielded combination is always the same object.
|
||
|
|
||
|
```js
|
||
|
import combinations from 'obliterator/combinations';
|
||
|
// Or
|
||
|
import {combinations} from 'obliterator';
|
||
|
|
||
|
const iterator = combinations(['A', 'B', 'C', 'D'], 2);
|
||
|
|
||
|
iterator.next().value;
|
||
|
>>> ['A', 'B']
|
||
|
iterator.next().value;
|
||
|
>>> ['A', 'C']
|
||
|
```
|
||
|
|
||
|
## consume
|
||
|
|
||
|
Function consuming the given iterator fully or for n steps.
|
||
|
|
||
|
```js
|
||
|
import consume from 'obliterator/consume';
|
||
|
// Or
|
||
|
import {consume} from 'obliterator';
|
||
|
|
||
|
const set = new Set([1, 2, 3]);
|
||
|
|
||
|
// Consuming the whole iterator
|
||
|
let iterator = set.values();
|
||
|
consume(iterator);
|
||
|
iterator.next().done >>> true;
|
||
|
|
||
|
// Consuming n steps
|
||
|
let iterator = set.values();
|
||
|
consume(iterator, 2);
|
||
|
iterator.next().value >>> 3;
|
||
|
```
|
||
|
|
||
|
## every
|
||
|
|
||
|
Function returning whether all items of an iterable-like match the given predicate function.
|
||
|
|
||
|
```js
|
||
|
import every from 'obliterator/every';
|
||
|
// Or
|
||
|
import {every} from 'obliterator';
|
||
|
|
||
|
every([2, 4, 6], n => n % 2 === 0);
|
||
|
>>> true
|
||
|
|
||
|
every([1, 2, 3], n => n % 2 === 0);
|
||
|
>>> false
|
||
|
```
|
||
|
|
||
|
## filter
|
||
|
|
||
|
Function returning an iterator filtering another one's values using the given predicate function.
|
||
|
|
||
|
```js
|
||
|
import filter from 'obliterator/filter';
|
||
|
// Or
|
||
|
import {filter} from 'obliterator';
|
||
|
|
||
|
const set = new Set([1, 2, 3, 4, 5]);
|
||
|
|
||
|
const even = x => x % 2 === 0;
|
||
|
|
||
|
const iterator = filter(set.values(), even);
|
||
|
|
||
|
iterator.next().value >>> 2;
|
||
|
iterator.next().value >>> 4;
|
||
|
```
|
||
|
|
||
|
## find
|
||
|
|
||
|
Function returning the next item matching given predicate function in an iterable-like.
|
||
|
|
||
|
```js
|
||
|
import find from 'obliterator/find';
|
||
|
// Or
|
||
|
import {find} from 'obliterator';
|
||
|
|
||
|
const set = new Set([1, 2, 3, 4, 5]);
|
||
|
|
||
|
const even = x => x % 2 === 0;
|
||
|
|
||
|
const values = set.values();
|
||
|
|
||
|
find(values, even);
|
||
|
>>> 2
|
||
|
|
||
|
find(values, even);
|
||
|
>>> 4
|
||
|
|
||
|
find(values, even);
|
||
|
>>> undefined
|
||
|
```
|
||
|
|
||
|
## forEach
|
||
|
|
||
|
Function able to iterate over almost any JavaScript iterable value using a callback.
|
||
|
|
||
|
Supported values range from arrays, typed arrays, sets, maps, objects, strings, arguments, iterators, arbitrary iterables etc.
|
||
|
|
||
|
```js
|
||
|
import forEach from 'obliterator/foreach';
|
||
|
// Or
|
||
|
import {forEach} from 'obliterator';
|
||
|
|
||
|
const set = new Set(['apple', 'banana']);
|
||
|
|
||
|
forEach(set.values(), (value, i) => {
|
||
|
console.log(i, value);
|
||
|
});
|
||
|
|
||
|
// Iterating over a string
|
||
|
forEach('abc', (char, i) => ...);
|
||
|
|
||
|
// Iterating over a map
|
||
|
forEach(map, (value, key) => ...);
|
||
|
```
|
||
|
|
||
|
## forEachWithNullKeys
|
||
|
|
||
|
Variant of [forEach](#foreach) one can use to iterate over mixed values but with the twist that iterables without proper keys (lists, sets etc.), will yield `null` instead of an index key.
|
||
|
|
||
|
Supported values range from arrays, typed arrays, sets, maps, objects, strings, arguments, iterators, arbitrary iterables etc.
|
||
|
|
||
|
```js
|
||
|
import {forEachWithNullKeys} from 'obliterator/foreach';
|
||
|
|
||
|
const set = new Set(['apple', 'banana']);
|
||
|
|
||
|
forEach(set, (value, key) => {
|
||
|
console.log(key, value);
|
||
|
});
|
||
|
>>> null, 'apple'
|
||
|
>>> null, 'banana'
|
||
|
```
|
||
|
|
||
|
## includes
|
||
|
|
||
|
Function returning whether the given value can be found in given iterable-like.
|
||
|
|
||
|
```js
|
||
|
import {includes} from 'obliterator';
|
||
|
// Or
|
||
|
import includes from 'obliterator/includes';
|
||
|
|
||
|
includes([1, 2, 3], 3);
|
||
|
>>> true;
|
||
|
|
||
|
includes('test', 'a');
|
||
|
>>> false;
|
||
|
```
|
||
|
|
||
|
## iter
|
||
|
|
||
|
Function casting any iterable-like value to a proper iterator. Will throw an error if the given value cannot be cast as an iterator.
|
||
|
|
||
|
```js
|
||
|
import {iter} from 'obliterator';
|
||
|
// Or
|
||
|
import iter from 'obliterator/iter';
|
||
|
|
||
|
iter('test');
|
||
|
iter(new Set([1, 2, 3]));
|
||
|
|
||
|
// This will throw:
|
||
|
iter(null);
|
||
|
```
|
||
|
|
||
|
## map
|
||
|
|
||
|
Function returning an iterator mapping another one's values using the given function.
|
||
|
|
||
|
```js
|
||
|
import map from 'obliterator/map';
|
||
|
// Or
|
||
|
import {map} from 'obliterator';
|
||
|
|
||
|
const set = new Set([1, 2, 3, 4, 5]);
|
||
|
|
||
|
const triple = x => x * 3;
|
||
|
|
||
|
const iterator = map(set.values(), triple);
|
||
|
|
||
|
iterator.next().value >>> 3;
|
||
|
iterator.next().value >>> 6;
|
||
|
```
|
||
|
|
||
|
## match
|
||
|
|
||
|
Function returning an iterator over the matches of a given regex applied to the target string.
|
||
|
|
||
|
```js
|
||
|
import match from 'obliterator/match';
|
||
|
// Or
|
||
|
import {match} from 'obliterator';
|
||
|
|
||
|
const iterator = match(/t/, 'test');
|
||
|
|
||
|
iterator.next().value.index >>> 0;
|
||
|
iterator.next().value.index >>> 3;
|
||
|
```
|
||
|
|
||
|
## permutations
|
||
|
|
||
|
Returns an iterator of permutations of the given array and of the given size.
|
||
|
|
||
|
Note that for performance reasons, the yielded permutation is always the same object.
|
||
|
|
||
|
```js
|
||
|
import permutations from 'obliterator/permutations';
|
||
|
// Or
|
||
|
import {permutations} from 'obliterator';
|
||
|
|
||
|
let iterator = permutations([1, 2, 3]);
|
||
|
|
||
|
iterator.next().value
|
||
|
>>> [1, 2, 3]
|
||
|
iterator.next().value
|
||
|
>>> [1, 3, 2]
|
||
|
|
||
|
iterator = permutations(['A', 'B', 'C', 'D'], 2);
|
||
|
|
||
|
iterator.next().value;
|
||
|
>>> ['A', 'B']
|
||
|
iterator.next().value;
|
||
|
>>> ['A', 'C']
|
||
|
```
|
||
|
|
||
|
## powerSet
|
||
|
|
||
|
Returns an iterator of sets composing the power set of the given array.
|
||
|
|
||
|
```js
|
||
|
import powerSet from 'obliterator/power-set';
|
||
|
// Or
|
||
|
import {powerSet} from 'obliterator';
|
||
|
|
||
|
const iterator = powerSet(['A', 'B', 'C']);
|
||
|
|
||
|
iterator.next().value;
|
||
|
>>> []
|
||
|
iterator.next().value;
|
||
|
>>> ['A']
|
||
|
```
|
||
|
|
||
|
## some
|
||
|
|
||
|
Returns whether the given iterable-like has some item matching the given predicate function.
|
||
|
|
||
|
```js
|
||
|
import some from 'obliterator/some';
|
||
|
// Or
|
||
|
import {some} from 'obliterator';
|
||
|
|
||
|
some(new Set([1, 2, 3]), n => n % 2 === 0);
|
||
|
>>> true
|
||
|
|
||
|
some('test', c => c === 'a');
|
||
|
>>> false
|
||
|
```
|
||
|
|
||
|
## split
|
||
|
|
||
|
Returns an iterator over the splits of the target string, according to the given RegExp pattern.
|
||
|
|
||
|
```js
|
||
|
import split from 'obliterator/split';
|
||
|
// Or
|
||
|
import {split} from 'obliterator';
|
||
|
|
||
|
const iterator = split(/;/g, 'hello;world;super');
|
||
|
|
||
|
iterator.next().value;
|
||
|
>>> 'hello'
|
||
|
iterator.next().value;
|
||
|
>>> 'world'
|
||
|
```
|
||
|
|
||
|
## take
|
||
|
|
||
|
Function taking values from given iterator and returning them in an array.
|
||
|
|
||
|
```js
|
||
|
import take from 'obliterator/take';
|
||
|
// Or
|
||
|
import {take} from 'obliterator';
|
||
|
|
||
|
const set = new Set([1, 2, 3]);
|
||
|
|
||
|
// To take n values from the iterator
|
||
|
take(set.values(), 2);
|
||
|
>>> [1, 2]
|
||
|
|
||
|
// To convert the full iterator into an array
|
||
|
take(set.values());
|
||
|
>>> [1, 2, 3]
|
||
|
```
|
||
|
|
||
|
# Contribution
|
||
|
|
||
|
Contributions are obviously welcome. Please be sure to lint the code & add the relevant unit tests before submitting any PR.
|
||
|
|
||
|
```
|
||
|
git clone git@github.com:Yomguithereal/obliterator.git
|
||
|
cd obliterator
|
||
|
npm install
|
||
|
|
||
|
# To lint the code
|
||
|
npm run lint
|
||
|
|
||
|
# To run the unit tests
|
||
|
npm test
|
||
|
```
|
||
|
|
||
|
# License
|
||
|
|
||
|
[MIT](LICENSE.txt)
|