Discontinued in favor of @proc7ts/push-iterator
AIterable is an abstract implementation of ES6 Iterable interface with methods of Array, like forEach, reduce, filter, map, etc. Unlike arrays these methods return AIterable instances instead of arrays.
Arrays considered implementing an AIterable interface as soon as they contain all expected methods.
The library is implemented in TypeScript and relies on tslib in iteration and generators support.
Execution environment is expected to be es2015-compliant. So, polyfills like core-js may be of use.
An AIterable interface contains only basic methods, not every one from the Array interface. The rest of the functionality could be achieved with the use of simple utilities this package also hosts.
Every AIterable method has an utility function counterpart, that performs the same operation over plain Iterable. You can use these functions if you don't want to deal with AIterable class, as they are tree-shakeable. This is advised approach when your code utilizes only a few functions. However, an AIterable class is more handy and does not add too much of the code to the final bundle.
import { AIterable } from '@proc7ts/a-iterable'; const it = AIterable.of({ *[Symbol.iterator]() { yield 1; yield 2; yield 3; } }); expect([...it.map(item => item * item)]).toBe([1, 4, 9]);The library contains a RevertibleIterable implemented by AIterable. It extends the standard Iterable interface with reverse() method, that constructs an iterable containing original iterable's elements in reverse order.
Arrays implement this interface. Note however, that the array counterpart reverses elements in place rather than creating a new array.
An iterable with Array-like iteration operations. Both Array and AIterable implement it.
Abstract Iterable implementation with array-like iteration operations.
Returns an iterable without elements.
import { AIterable } from '@proc7ts/a-iterable'; expect(AIterable.none()[Symbol.iterator]().next().done).toBe(true);Checks whether the given iterable is an array-like one.
import { AIterable } from '@proc7ts/a-iterable'; AIterable.is([1, 2, 3]); // true AIterable.is({ *[Symbol.iterator]() { yield 'something'; } }); // falseCreates an AIterable instance that iterates over the same elements as the given one if necessary.
import { AIterable } from '@proc7ts/a-iterable'; AIterable.of([1, 2, 3]); AIterable.of({ *[Symbol.iterator]() { yield 'something'; } });When called for the object already implementing ArrayLikeIterable (such as Array), this method returns the source object itself.
Creates an AIterable instance that iterates over the same elements as the given one.
Unlike AIterable.of() this function always creates new AIterable instance. This may be useful when converting array and iterating over its elements. This way new array instances won't be created.
Uses reverseIt() function to reverse the constructed iterable.
import { AIterable, itsFirst } from '@proc7ts/a-iterable'; itsFirst(AIterable.from([1, 2, 3]).filter(x => x > 1)); // 2Tests whether all elements pass the test implemented by the provided function. Corresponds to Array.prototype.every().
The utility function counterpart operating over plain iterables is itsEvery().
import { AIterable, itsEvery } from '@proc7ts/a-iterable'; const numbers = AIterable.from([1, 30, 39, 29, 10, 13]); numbers.every(x => x < 40); // true itsEvery(numbers, x => x < 40); // Plain iterable counterpart numbers.every(x => x < 20); // false itsEvery([], x => false); // Always `true` for empty iterableCreates an iterable with all elements that pass the test implemented by the provided function. Corresponds to Array.prototype.filter().
The utility function counterpart operating over plain iterables is filterIt().
import { AIterable, filterIt } from '@proc7ts/a-iterable'; const words = AIterable.of(['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present']); words.filter(word => word.length > 6); // "exuberant", "destruction", "present" filterIt(words, word => word.length > 6); // Plain iterable counterpartFirst maps each element using a mapping function, then flattens the result into a new iterable. Corresponds to Array.prototype.flatMap().
The utility function counterpart operating over plain iterables is flatMapIt().
import { AIterable, flatMapIt } from '@proc7ts/a-iterable'; const numbers = AIterable.of([1, 2, 3]); numbers.flatMap(x => [x, x + 10]); // 1, 11, 2, 12, 3, 13 flatMapIt(numbers, x => [x, x + 10]); // Plain iterable counterpartPerforms the given action for each element. Corresponds to Array.prototype.forEach().
The utility function counterpart operating over plain iterables is itsEach().
import { AIterable, itsEach } from '@proc7ts/a-iterable'; AIterable.is([1, 2, 3]).forEach(console.log); // 1, 2, 3 itsEach([1, 2, 3], console.log); // Plain iterable counterpartCreates a new iterable with the results of calling a provided function on every element. Corresponds to Array.prototype.map().
The utility function counterpart operating over plain iterables is mapIt().
import { AIterable, mapIt } from '@proc7ts/a-iterable'; const numbers = AIterable.of([1, 4, 9, 16]); numbers.map(x => x * 2); // 2, 8, 18, 32 mapIt(numbers, x => x * 2); // Plain iterable counterpartApplies a function against an accumulator and each element to reduce elements to a single value. Corresponds to Array.prototype.reduce().
The utility function counterpart operating over plain iterables is itsReduction().
import { AIterable, itsReduction } from '@proc7ts/a-iterable'; const numbers = AIterable.of([1, 2, 3, 4]); numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0); // 10 itsReduction(numbers, (accumulator, currentValue) => accumulator + currentValue, 0); // Plain iterable counterpartConstructs an iterable containing this iterable's elements in reverse order.
Corresponds to Array.prototype.reverse(). Note however, that the array counterpart reverses elements in place rather than creating a new array.
The utility function counterpart operating over plain iterables is reverseIt().
import { AIterable, reverseIt } from '@proc7ts/a-iterable'; const numbers = [1, 2, 3, 4]; const iter = AIterable.from(numbers); iter.reverse(); // 4, 3, 2, 1 reverseIt(numbers); // Plain iterable counterpartTests whether some element passed the test implemented by the provided function. Corresponds to Array.prototype.some().
The utility function counterpart operating over plain iterables is itsSome().
import { AIterable, itsSome } from '@proc7ts/a-iterable'; const numbers = AIterable.from([1, 30, 39, 29, 10, 13]); numbers.some(x => x < 2); // true itsSome(numbers, x => x < 2); // Plain iterable counterpart numbers.some(x => x > 40); // false itsSome([], x => true); // Always `false` for empty iterablesPasses each element of this iterable trough a chain of transformation passes.
The passes are preformed by @proc7ts/call-thru library.
The utility function counterpart operating over plain iterables is thruIt().
import { AIterable, passIf, thruIt } from '@proc7ts/a-iterable'; const numbers = [1, 2, 3]; const iter = AIterable.from(numbers); iter.thru( passIf((n: number) => n > 1), n => n * n, ); // 4, 9 thruIt( passIf((n: number) => n > 1), n => n * n, ); // Plain iterable counterpartExtends an iterable class with AIterable API.
import { AIterable, toAIterable } from '@proc7ts/a-iterable'; class BaseIterable implements Iterable<number> { * [Symbol.iterator](): Iterator<number> { yield 1; yield 2; yield 3; } } const ExtendedIterable = toAIterable(BaseIterable); const extended = new ExtendedIterable(); extended.forEach(console.log); // Prints 1, 2, 3 as `forEach` method is present in `ExtendedIterable`Checks whether the given iterable is empty.
import { AIterable, itsEmpty } from '@proc7ts/a-iterable'; !itsEmpty(AIterable.from([1, 2, 3]).filter(x => x === 2)); // `Array.includes()` analog !itsEmpty(AIterable.from([1, 2, 3]).filter(x => x > 1)); // `Array.some()` analogReturns the first element of the given iterable.
import { AIterable, itsFirst } from '@proc7ts/a-iterable'; itsFirst(AIterable.from([1, 2, 3]).filter(x => x === 2)); // `Array.find()` analogReturns the last element of the given iterable.
If the given iterable is an array-like structure, then just returns its last element. If it is revertible, then extracts the first element of the reverted one. Otherwise iterates over elements to find the last one.
import { itsLast } from '@proc7ts/a-iterable'; itsLast([1, 2, 3]); // 3Starts iteration over the given iterable.
This is a shortcut for iterable[Symbol.iterator] to make it friendlier to minification.
import { itsIterator } from '@proc7ts/a-iterable'; itsIterator([1, 2, 3]).next().value; // 1Creates custom iterable.
import { itsIterator, makeIt } from '@proc7ts/a-iterable'; const array = [1, 2, 3]; makeIt(() => itsIterator(array)); // Iterable over array elements makeIt(() => itsIterable(array), () => [...array].reverse()); // Revertible iterable over array elements Builds an revertible iterable over elements of array-like structure, like Array or DOM NodeList.
import { overArray } from '@proc7ts/a-iterable'; expect([...overArray([1, 2, 3])]).toEqual([1, 2, 3]); expect([...overArray([1, 2, 3]).reverse()]).toEqual([3, 2, 1]);Builds an iterable over the key/value entries of the given object.
import { overEntries } from '@proc7ts/a-iterable'; overEntries({ a: 1, [1]: 'one', [Symbol.iterator]: null, }) // Contains `['a', 1]`, `['1', 'one']`, and `[Symbol.iterator, null]`Builds an iterable over the keys of the given object.
import { overKeys } from '@proc7ts/a-iterable'; overKeys({ a: 1, [1]: 'one', [Symbol.iterator]: null, }) // Contains `'a'`, `'1'`, and `Symbol.iterator`Returns an iterable without elements revertible to itself.
import { overNone } from '@proc7ts/a-iterable'; expect([...overNone()]).toEqual([]); expect([...overNone().reverse()]).toEqual([]);Constructs a reversed iterable.
If the source iterable is an array, then uses reverseArray() function to revert the constructed iterable. If the source iterable is revertible, then uses its reverse() method to revert the constructed one. Otherwise stores elements to array and reverts them with reverseArray() function.
import { reverseIt } from '@proc7ts/a-iterable'; reverseIt([1, 2 ,3]); // [3, 2, 1]Constructs an iterable of array-like structure elements in reverse order.
import { reverseArray } from '@proc7ts/a-iterable'; reverseArray([1, 2 ,3]); // [3, 2, 1]