UNPKG

@sekwiatkowski/js-fp

Version:

A pragmatic functional programming library for JavaScript/TypeScript

266 lines 7.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const __1 = require(".."); const Fulfilled_1 = require("../future/Fulfilled"); const Rejected_1 = require("../future/Rejected"); //region Access function getItem(items, index) { return __1.option(items[index]); } exports.getItem = getItem; function getItemOrElse(items, index, alternative) { if (items.length > index) { return items[index]; } else { return alternative instanceof Function ? alternative() : alternative; } } exports.getItemOrElse = getItemOrElse; function takeItems(items, n) { if (n > 0) { return items.slice(0, n); } else { const length = items.length; return items.slice(length + n, length); } } exports.takeItems = takeItems; //endregion //region Chaining function flatten(items) { let size = 0; for (let itemIndex = 0; itemIndex < items.length; itemIndex++) { const item = items[itemIndex]; if (item instanceof Array) { size += item.length; } else { size += item.size(); } } const flattened = new Array(size); let flattenedIndex = 0; for (let listIndex = 0; listIndex < items.length; listIndex++) { items[listIndex].forEach(item => { flattened[flattenedIndex++] = item; }); } return flattened; } exports.flatten = flatten; //endregion //region Expansion function appendItem(items, item) { return [...items, item]; } exports.appendItem = appendItem; function prependItem(items, item) { return [item, ...items]; } exports.prependItem = prependItem; //endregion //region Filtering function filterItems(items, predicate) { return items.filter(predicate); } exports.filterItems = filterItems; //endregion //region Reduction function reduceItemsBy(items, by, operation) { let accumulator = by(items[0]); for (let i = 1; i < items.length; i++) { accumulator = operation(accumulator)(by(items[i])); } return accumulator; } exports.reduceItemsBy = reduceItemsBy; function foldItemsBy(items, by, operation, initialValue) { let accumulator = initialValue; for (let i = 0; i < items.length; i++) { accumulator = operation(accumulator)(by(items[i])); } return accumulator; } exports.foldItemsBy = foldItemsBy; //endregion //region Grouping function chunked(items, size) { const chunks = []; for (let index = 0; index < items.length; index += size) { const chunk = items.slice(index, index + size); chunks.push(chunk); } return chunks; } exports.chunked = chunked; function groupItemsBy(items, computeKey) { let dictionary = {}; for (let i = 0; i < items.length; i++) { const item = items[i]; const key = computeKey(item); if (!(key in dictionary)) { dictionary[key] = []; } dictionary[key].push(item); } return dictionary; } exports.groupItemsBy = groupItemsBy; //endregion //region Mapping function mapItems(items, f) { return items.map(f); } exports.mapItems = mapItems; function parallelMapItems(items, f) { return new __1.Future(() => new Promise(resolve => { const promises = items.map(x => new Promise(resolve => resolve(f(x)))); return Promise.all(promises) .then(mappedItems => resolve(Fulfilled_1.fulfilled(mappedItems))) .catch(error => resolve(Rejected_1.rejected(error))); })); } exports.parallelMapItems = parallelMapItems; //endregion //region Construction function rangeOfItems(start, end) { if (start == 0 && end == null || start === end) { return []; } function sanitize(start, end) { // end is not specified if (end == null) { return { sanitizedStart: 0, sanitizedEnd: start }; } // end is specified else { return { sanitizedStart: start, sanitizedEnd: end }; } } function configure(start, end) { if (start > end) { // Ex.: start: 2, end: 0 // size: 2, step: -1 // Ex.: start: -3, end: -6 // size: 3, step: -1 // Ex.: start: 0, end: -1 // size: 1, step: -1 return { size: Math.abs(start - end), step: -1 }; } else { // Ex.: start: 0, end: 1 // size: 1, step: 1 // Ex.: start: -3, end: -6 // size: 3, step: -1 return { size: Math.abs(end - start), step: 1 }; } } const { sanitizedStart, sanitizedEnd } = sanitize(start, end); const { size, step } = configure(sanitizedStart, sanitizedEnd); const range = new Array(size); for (let index = 0, item = sanitizedStart; index < size; index++, item += step) { range[index] = item; } return range; } exports.rangeOfItems = rangeOfItems; function repeatItems(times, valueOrFunction) { const items = new Array(times); if (valueOrFunction instanceof Function) { for (let index = 0; index < times; index++) { items[index] = valueOrFunction(index); } } else { for (let index = 0; index < times; index++) { items[index] = valueOrFunction; } } return items; } exports.repeatItems = repeatItems; //endregion //region Search function findItem(items, predicate) { for (let i = 0; i < items.length; i++) { const item = items[i]; if (predicate(item)) { return __1.some(item); } } return __1.none; } exports.findItem = findItem; function findLastItem(items, predicate) { for (let index = items.length - 1; index >= 0; index--) { const item = items[index]; if (predicate(item)) { return __1.some(item); } } return __1.none; } exports.findLastItem = findLastItem; //endregion //region Side-effects function forEachItem(items, sideEffect) { items.forEach(sideEffect); } exports.forEachItem = forEachItem; //endregion //region Sorting function sortItems(items, compare) { return items.sort(compare); } exports.sortItems = sortItems; function sortItemsBy(items, by, compare) { return items.sort((a, b) => compare(by(a), by(b))); } exports.sortItemsBy = sortItemsBy; //endregion //region Testing function containsItem(items, item, equality) { for (let i = 0; i < items.length; i++) { if (equality(items[i], item)) { return true; } } return false; } exports.containsItem = containsItem; function allItems(items, predicate) { for (let index = 0; index < items.length; index++) { if (!predicate(items[index])) { return false; } } return true; } exports.allItems = allItems; function someItem(items, predicate) { for (let index = 0; index < items.length; index++) { if (predicate(items[index])) { return true; } } return false; } exports.someItem = someItem; function noItems(items, predicate) { return !someItem(items, predicate); } exports.noItems = noItems; function countItems(items, predicate) { let count = 0; for (let index = 0; index < items.length; index++) { if (predicate(items[index])) { count += 1; } } return count; } exports.countItems = countItems; //endregion //# sourceMappingURL=ArrayFunctions.js.map