The constructor takes an Iterable.
Works with Array.
import { IterableCollection } from "@daiso-tech/core";
const collection = new IterableCollection([1, 2, 3, 4]);
Works with String.
import { IterableCollection } from "@daiso-tech/core";
const collection = new IterableCollection("ABCDE");
Works with Set.
import { IterableCollection } from "@daiso-tech/core";
const collection = new IterableCollection(new Set([1, 2, 2 4]));
Works with Map.
The after method returns the item that comes after the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the last item then null is returned.
The afterOr method returns the item that comes after the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the last item then defaultValue is returned.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.afterOr(-1, item => item === 2);
// 3
}
The afterOrFail method returns the item that comes after the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the last item then an error is thrown.
The append method adds iterable to the end of the collection.
The beforeOr method returns the item that comes before the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the first item then defaultValue is returned.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.beforeOr(-1, item => item === 2);
// 1
}
The beforeOrFail method returns the item that comes before the first item that matches predicateFn. If the collection is empty or the predicateFn does not match or matches the first item then an error is thrown.
The change method changes only the items that passes predicateFn using mapFn.
The chunk method breaks the collection into multiple, smaller collections of size chunkSize. If chunkSize is not divisible with total number of items then the last chunk will contain the remaining items.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection.apppend([1, 2, 3, 4, 5, 6, 7]);
const chunks = collection.chunk(4);
chunks.map(chunk => chunk.toArray()).toArray();
// [[1, 2, 3, 4], [5, 6, 7]]
}
The chunkWhile method breaks the collection into multiple, smaller collections based on the evaluation of predicateFn. The chunk variable passed to the predicateFn may be used to inspect the previous item.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend("AABBCCCD")
.chunkWhile((value, index, chunk) => {
return value === chunk.last();
})
.map(chunk => chunk.toArray())
.toArray();
// [["A", "A"], ["B", "B"], ["C", "C", "C"], ["D"]]
}
The collapse method collapses a collection of iterables into a single, flat collection.
The count method returns the total number of items in the collection that passes predicateFn.
The countBy method counts the occurrences of values in the collection by selectFn . By default the equality check occurs on the item.
Optional
selectFn: Map<TInput, ICollection<TInput>, TOutput>import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend(["a", "a", "a", "b", "b", "c"])
.countBy()
.map(([key, collection]) => [key, .toArray()])
.toArray();
// [
// ["a", 3],
// ["b", 2],
// ["c", 1]
// ]
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend(["alice@gmail.com", "bob@yahoo.com", "carlos@gmail.com"])
.countBy(item => item.split("@")[1])
.toArray();
// [
// ["gmail.com", 2],
// ["yahoo.com", 1]
// ]
}
The crossJoin method cross joins the collection's values among iterables, returning a Cartesian product with all possible permutations.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2])
.cross(["a", "b"])
.toArray();
// [
// [1, "a"],
// [1, "b"],
// [2, "a"],
// [2, "b"],
// ]
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2])
.cross(["a", "b"])
.cross(["I", "II"])
.toArray();
// [
// [1, "a", "I"],
// [1, "a", "II"],
// [1, "b", "I"],
// [1, "b", "II"],
// [2, "a", "I"],
// [2, "a", "II"],
// [2, "b", "I"],
// [2, "b", "II"],
// ]
}
The difference method will return the values in the original collection that are not present in iterable. By default the equality check occurs on the item.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 2, 3, 4, 5])
.difference([2, 4, 6, 8])
.toArray();
// [1, 3, 5]
}
import type { ICollection } from "@daiso-tech/core";
type Phone = {
name: string;
brand: string;
type: string;
};
// Assume the inputed collection is empty.
function main(collection: ICollection<Phone>): void {
collection
.apppend([
{ name: "iPhone 6", brand: "Apple", type: "phone" },
{ name: "iPhone 5", brand: "Apple", type: "phone" },
{ name: "Apple Watch", brand: "Apple", type: "watch" },
{ name: "Galaxy S6", brand: "Samsung", type: "phone" },
{ name: "Galaxy Gear", brand: "Samsung", type: "watch" },
])
.difference(
[
{ name: "Apple Watch", brand: "Apple", type: "watch" },
],
(product) => product.type
)
.toArray();
// [
// { name: "iPhone 6", brand: "Apple", type: "phone" },
// { name: "iPhone 5", brand: "Apple", type: "phone" },
// { name: "Galaxy S6", brand: "Samsung", type: "phone" },
// ]
}
The entries returns an ICollection of key, value pairs for every entry in the collection.
The filter method filters the collection using predicateFn, keeping only those items that pass predicateFn.
The first method returns the first item in the collection that passes predicateFn . By default it will get the first item. If the collection is empty or no items passes predicateFn than null i returned.
Optional
predicateFn: Predicate<TInput, ICollection<TInput>, TOutput>import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.first();
// 1
}
The firstOr method returns the first item in the collection that passes predicateFn By default it will get the first item. If the collection is empty or no items passes predicateFn than defaultValue .
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.firstOr(-1);
// 1
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.firstOr(-1, item => item > 2);
// 3
}
The firstOrFail method returns the first item in the collection that passes predicateFn . By default it will get the first item. If the collection is empty or no items passes predicateFn than error is thrown.
Optional
predicateFn: Predicate<TInput, ICollection<TInput>, TOutput>import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.firstOrFail();
// 1
}
The flatMap method returns a new array formed by applying mapFn to each item of the array, and then collapses the result by one level. It is identical to a map method followed by a collapse method.
The forEach method iterates through all items in the collection.
The groupBy method groups the collection's items by selectFn . By default the equality check occurs on the item.
Optional
selectFn: Map<TInput, ICollection<TInput>, TOutput>import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend(["a", "a", "a", "b", "b", "c"])
.groupBy()
.map(([key, collection]) => [key, .toArray()])
.toArray();
// [
// [
// "a",
// ["a", "a", "a"]
// ],
// [
// "b",
// ["b", "b"]
// ],
// [
// "c",
// ["c"]
// ]
// ]
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection.apppend(["alice@gmail.com", "bob@yahoo.com", "carlos@gmail.com"]);
const group = collection
.groupBy(item => item.split("@")[1])
.map(([key, collection]) => [key, .toArray()])
.toArray();
// [
// [
// "gmail.com",
// ["alice@gmail.com", "carlos@gmail.com"]
// ],
// [
// "yahoo.com",
// ["bob@yahoo.com"]
// ]
// ]
}
The insertAfter method adds iterable after the first item that matches predicateFn.
The insertBefore method adds iterable before the first item that matches predicateFn.
The join method joins the collection's items with separator . An error will be thrown when if a none string item is encounterd.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.append([1, 2, 3, 4])
.map(item => item.toString())
.join();
// "1,2,3,4"
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.append([1, 2, 3, 4])
.map(item => item.toString())
.join("_");
// "1_2_3_4"
}
The keys method returns an ICollection of keys in the collection.
The last method returns the last item in the collection that passes predicateFn . By default it will get the last item. If the collection is empty or no items passes predicateFn than null i returned.
Optional
predicateFn: Predicate<TInput, ICollection<TInput>, TOutput>import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.last();
// 4
}
The lastOr method returns the last item in the collection that passes predicateFn . By default it will get the last item. If the collection is empty or no items passes predicateFn than defaultValue .
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.lastOr(-1);
// 4
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.lastOr(-1, item => item < 4);
// 3
}
The lastOrFail method returns the last item in the collection that passes predicateFn . By default it will get the last item. If the collection is empty or no items passes predicateFn than error is thrown.
Optional
predicateFn: Predicate<TInput, ICollection<TInput>, TOutput>import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.lastOrFail();
// 4
}
The map method iterates through the collection and passes each item to mapFn. The mapFn is free to modify the item and return it, thus forming a new collection of modified items.
The nth method creates a new collection consisting of every n-th item.
The padEnd method pads this collection with fillItems until the resulting collection size reaches maxLength. The padding is applied from the end of this collection.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.append("abc")
.padEnd(10, "foo")
.join("");
// "abcfoofoof"
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.append("abc")
.padEnd(6, "123465")
.join("");
// "abc123"
}
The padStart method pads this collection with fillItems until the resulting collection size reaches maxLength. The padding is applied from the start of this collection.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.append("abc")
.padStart(10, "foo")
.join("");
// "foofoofabc"
}
function main(collection: ICollection<string>): void {
collection
.append("abc")
.padStart(6, "123465")
.join("");
// "123abc"
}
The page method returns a new collection containing the items that would be present on page with custom pageSize .
The partition method is used to separate items that pass predicateFn from those that do not.
The percentage method may be used to quickly determine the percentage of items in the collection that pass predicateFn. If the collection is empty an error will also be thrown.
The pipe method passes the orignal collection to callback and returns the result from callback. This method is useful when you want compose multiple smaller functions.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
function toNbrs<TInput>(
collection: ICollection<TInput>,
): ICollection<number> {
return collection
.map((item) => Number(item))
.reject((nbr) => Number.isNaN(nbr));
}
function nbrToStr(collection: ICollection<number>): number[] {
return collection.repeat(2).toArray();
}
const piped = collection
.apppend([1, "2", "a", 1, 3, {}])
.pipe(toNbrs)
.pipe(nbrToStr);
// [ 1, 2, 1, 3 ]
}
The prepend method adds iterable to the beginning of the collection.
The reduce method executes reduceFn function on each item of the array, passing in the return value from the calculation on the preceding item. The final result of running the reducer across all items of the array is a single value.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.append([1, 2, 3]);
.reduce((sum, item) => sum + item);
// 6
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.append(["a", "b", "c"])
.entries()
.reduce(
(record, [key, value]) => ({
...record,
[key]: value
}),
{} as Record<number, string>
);
// { 0: "a", 1: "b", 2: "c" }
}
The reject method filters the collection using predicateFn, keeping only those items that not pass predicateFn.
The repeat method will repeat the original collection amount times.
The reverse method will reverse the order of the collection. The reversing of the collection will be applied in chunks that are the size of chunkSize .
The searchFirst return the index of the first item that matches predicateFn.
The searchLast return the index of the last item that matches predicateFn.
The set method changes a item by i>index using value.
The shuffle method randomly shuffles the items in the collection. You can provide a custom Math.random function by passing in mathRandom.
Returns a pseudorandom number between 0 and 1.
The skip method skips the first offset items.
The skipUntil method skips items until predicateFn returns true.
The skipWhile method skips items until predicateFn returns false.
The slice method creates porition of the original collection selected from start and end where start and end (end not included) represent the index of items in the collection.
Optional
start: numberOptional
end: numberimport type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend(["a", "b", "c", "d", "e", "f"])
.slice(3)
.toArray();
// ["d", "e", "f"]
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend(["a", "b", "c", "d", "e", "f"])
.slice(undefined, 2)
.toArray()
// ["a", "b"]
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend(["a", "b", "c", "d", "e", "f"])
.slice(2, 5)
.toArray()
// ["c", "d", "e"]
}
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend(["a", "b", "c", "d", "e", "f"])
.slice(-2)
.toArray();
// ["e", "f"]
}
The sliding method returns a new collection of chunks representing a "sliding window" view of the items in the collection.
The sole method returns the first item in the collection that passes predicateFn, but only if predicateFn matches exactly one item. If no items matches or multiple items are found an error will be thrown.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4, 5])
.sole(item => item === 4);
// 4
}
The sort method sorts the collection. You can provide a comparator function.
Optional
comparator: Comparator<TInput>import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([-1, 2, 4, 3])
.sort()
.toArray()
// [-1, 2, 3, 4]
}
import type { ICollection } from "@daiso-tech/core";
type Person = {
name: string;
age: number;
};
// Assume the inputed collection is empty.
function main(collection: ICollection<Person>): void {
collection
.apppend([
{ name: "Anders", age: 30 },
{ name: "Joe", age: 20 },
{ name: "Hasan", age: 25 },
{ name: "Linda", age: 19 }
])
.sort(({ age: ageA }, { age: ageB }) => ageA - ageB)
.toArray();
// [
// { name: "Linda", age: 19 }
// { name: "Joe", age: 20 },
// { name: "Hasan", age: 25 },
// { name: "Anders", age: 30 },
// ]
}
The split method breaks a collection evenly into chunkAmount of chunks.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4, 5])
.split(3)
.map(chunk => chunk.toArray())
.toArray();
// [[1, 2], [3, 4], [5]]
}
The take method takes the first limit items.
The takeUntil method takes items until predicateFn returns true.
The takeWhile method takes items until predicateFn returns false.
The tap method passes a copy of the original collection to callback, allowing you to do something with the items while not affecting the original collection.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection.apppend([1, 2, 3, 4, 5, 6])
.tap(collection => {
collection
.filter(value => value % 2 === 0)
.forEach(value => console.log(value))
})
.toArray();
// [1, 2, 3, 4, 5, 6]
}
The toRecord method converts the collection to a new Record. An error will be thrown if item is not a tuple of size 2 where the first element is a string or a number.
The unique method removes all duplicate values from the collection by selectFn . By default the equality check occurs on the item.
Optional
selectFn: Map<TInput, ICollection<TInput>, TOutput>import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 1, 2, 2, 3, 4, 2])
.unique()
.toArray();
// [1, 2, 3, 4]
}
import type { ICollection } from "@daiso-tech/core";
type Phone = {
name: string;
brand: string;
type: string;
};
// Assume the inputed collection is empty.
function main(collection: ICollection<Phone>): void {
collection
.apppend([
{ name: "iPhone 6", brand: "Apple", type: "phone" },
{ name: "iPhone 5", brand: "Apple", type: "phone" },
{ name: "Apple Watch", brand: "Apple", type: "watch" },
{ name: "Galaxy S6", brand: "Samsung", type: "phone" },
{ name: "Galaxy Gear", brand: "Samsung", type: "watch" },
])
.unique(item => item.brand)
.toArray();
// [
// { name: "iPhone 6", brand: "Apple", type: "phone" },
// { name: "Galaxy S6", brand: "Samsung", type: "phone" },
// ]
}
The values method returns a copy of the collection.
The when method will execute callback when condition evaluates to true.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection
.apppend([1, 2, 3, 4])
.when(true, collection => collection.append([-3]))
.when(false, collection => collection.append([20]))
.toArray();
// [1, 2, 3, 4, -3]
}
The whenEmpty method will execute callback when the collection is empty.
The whenNot method will execute callback when condition evaluates to false.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<number>): void {
collection.apppend([1, 2, 3, 4])
.whenNot(true, collection => collection.append([-3]))
.whenNot(false, collection => collection.append([20]))
.toArray();
// [1, 2, 3, 4, 20]
}
The whenNotEmpty method will execute callback when the collection is not empty.
The zip method merges together the values of iterable with the values of the collection at their corresponding index. The returned collection has size of the shortest collection.
import type { ICollection } from "@daiso-tech/core";
// Assume the inputed collection is empty.
function main(collection: ICollection<string>): void {
collection
.apppend(["Chair", "Desk"]);
.zip([100, 200]);
.toArray();
// [["Chair", 100], ["Desk", 200]]
}
Static
concatThe concat static method is a convenient utility for easily concatenating multiple Iterable.
import { IterableCollection } from "@daiso-tech/core";
class MyIterable implements Iterable<number> {
*[Symbol.iterator](): Iterator<number> {
yield 1;
yield 2;
yield 3;
}
}
const collection = IterableCollection.concat([
new MyIterable(),
new Set([1, 2, 3]),
new Map([["a", 1], ["b", 2]]),
["a", "b", "c"]
]);
collection.toArray();
// [1, 2, 3, 1, 2, 3, ["a", 1], ["b", 2], "a", "b", "c"]
Static
deserializeStatic
differenceThe difference static method is used to compute the difference between two Iterable instances. By default, the equality check is performed on each item.
import { IterableCollection } from "@daiso-tech/core";
const collection = IterableCollection.difference(
[1, 2, 2, 3, 4, 5],
[2, 4, 6, 8]
);
collection.toArray();
// [1, 3, 5]
import { IterableCollection } from "@daiso-tech/core";
const collection = IterableCollection.difference(
[
{ name: "iPhone 6", brand: "Apple", type: "phone" },
{ name: "iPhone 5", brand: "Apple", type: "phone" },
{ name: "Apple Watch", brand: "Apple", type: "watch" },
{ name: "Galaxy S6", brand: "Samsung", type: "phone" },
{ name: "Galaxy Gear", brand: "Samsung", type: "watch" },
],
[
{ name: "Apple Watch", brand: "Apple", type: "watch" },
],
(product) => product.type
);
collection.toArray();
// [
// { name: "iPhone 6", brand: "Apple", type: "phone" },
// { name: "iPhone 5", brand: "Apple", type: "phone" },
// { name: "Galaxy S6", brand: "Samsung", type: "phone" },
// ]
Static
zipThe zip static method merges together the values of iterableA with the values of the iterableB at their corresponding index. The returned collection has size of the shortest collection.
import { IterableCollection } from "@daiso-tech/core";;
const collection = IterableCollection.zip(["Chair", "Desk"], [100, 200]);
collection.toArray();
// [["Chair", 100], ["Desk", 200]]
All methods that return ICollection are executed lazly which means they will be executed when the IterableCollection is iterated with forEach method or "for of" loop. The rest of the methods are executed eagerly.
IMPORT_PATH:
"@daiso-tech/core/collection/implementations"