fp-ts
Version:
Functional programming in TypeScript
1,347 lines (1,346 loc) • 37.4 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.rotate = exports.intersperse = exports.prependToAll = exports.unzip = exports.zip = exports.zipWith = exports.sort = exports.lefts = exports.rights = exports.reverse = exports.modifyAt = exports.deleteAt = exports.updateAt = exports.insertAt = exports.copy = exports.findLastIndex = exports.findLastMap = exports.findLast = exports.findFirstMap = exports.findFirst = exports.findIndex = exports.dropLeftWhile = exports.dropRight = exports.dropLeft = exports.spanLeft = exports.takeLeftWhile = exports.takeRight = exports.takeLeft = exports.init = exports.tail = exports.last = exports.head = exports.snoc = exports.cons = exports.lookup = exports.isOutOfBound = exports.isNonEmpty = exports.isEmpty = exports.scanRight = exports.scanLeft = exports.foldRight = exports.foldLeft = exports.flatten = exports.replicate = exports.range = exports.makeBy = exports.getOrd = exports.getEq = exports.getMonoid = exports.getShow = void 0;
exports.Applicative = exports.FunctorWithIndex = exports.Functor = exports.URI = exports.zero = exports.unfold = exports.wilt = exports.wither = exports.traverseWithIndex = exports.sequence = exports.traverse = exports.reduceRightWithIndex = exports.reduceRight = exports.reduceWithIndex = exports.reduce = exports.foldMapWithIndex = exports.foldMap = exports.duplicate = exports.extend = exports.filterWithIndex = exports.filterMapWithIndex = exports.alt = exports.altW = exports.partitionMapWithIndex = exports.partitionMap = exports.partitionWithIndex = exports.partition = exports.filterMap = exports.filter = exports.separate = exports.compact = exports.mapWithIndex = exports.chainFirst = exports.chainWithIndex = exports.chain = exports.apSecond = exports.apFirst = exports.ap = exports.map = exports.of = exports.difference = exports.intersection = exports.union = exports.comprehension = exports.chunksOf = exports.splitAt = exports.chop = exports.sortBy = exports.uniq = exports.elem = void 0;
exports.apS = exports.bind = exports.bindTo = exports.Do = exports.some = exports.every = exports.empty = exports.unsafeDeleteAt = exports.unsafeUpdateAt = exports.unsafeInsertAt = exports.array = exports.Witherable = exports.TraversableWithIndex = exports.Traversable = exports.FoldableWithIndex = exports.Foldable = exports.FilterableWithIndex = exports.Filterable = exports.Compactable = exports.Extend = exports.Alternative = exports.Alt = exports.Unfoldable = exports.Monad = void 0;
var RA = __importStar(require("./ReadonlyArray"));
// -------------------------------------------------------------------------------------
// model
// -------------------------------------------------------------------------------------
/* tslint:disable:readonly-array */
/**
* @category instances
* @since 2.0.0
*/
exports.getShow = RA.getShow;
/**
* Returns a `Monoid` for `Array<A>`
*
* @example
* import { getMonoid } from 'fp-ts/Array'
*
* const M = getMonoid<number>()
* assert.deepStrictEqual(M.concat([1, 2], [3, 4]), [1, 2, 3, 4])
*
* @category instances
* @since 2.0.0
*/
exports.getMonoid = RA.getMonoid;
/**
* Derives an `Eq` over the `Array` of a given element type from the `Eq` of that type. The derived `Eq` defines two
* arrays as equal if all elements of both arrays are compared equal pairwise with the given `E`. In case of arrays of
* different lengths, the result is non equality.
*
* @example
* import { eqString } from 'fp-ts/Eq'
* import { getEq } from 'fp-ts/Array'
*
* const E = getEq(eqString)
* assert.strictEqual(E.equals(['a', 'b'], ['a', 'b']), true)
* assert.strictEqual(E.equals(['a'], []), false)
*
* @category instances
* @since 2.0.0
*/
exports.getEq = RA.getEq;
/**
* Derives an `Ord` over the `Array` of a given element type from the `Ord` of that type. The ordering between two such
* arrays is equal to: the first non equal comparison of each arrays elements taken pairwise in increasing order, in
* case of equality over all the pairwise elements; the longest array is considered the greatest, if both arrays have
* the same length, the result is equality.
*
* @example
* import { getOrd } from 'fp-ts/Array'
* import { ordString } from 'fp-ts/Ord'
*
* const O = getOrd(ordString)
* assert.strictEqual(O.compare(['b'], ['a']), 1)
* assert.strictEqual(O.compare(['a'], ['a']), 0)
* assert.strictEqual(O.compare(['a'], ['b']), -1)
*
* @category instances
* @since 2.0.0
*/
exports.getOrd = RA.getOrd;
// -------------------------------------------------------------------------------------
// constructors
// -------------------------------------------------------------------------------------
/**
* Return a list of length `n` with element `i` initialized with `f(i)`
*
* @example
* import { makeBy } from 'fp-ts/Array'
*
* const double = (n: number): number => n * 2
* assert.deepStrictEqual(makeBy(5, double), [0, 2, 4, 6, 8])
*
* @category constructors
* @since 2.0.0
*/
exports.makeBy = RA.makeBy;
/**
* Create an array containing a range of integers, including both endpoints
*
* @example
* import { range } from 'fp-ts/Array'
*
* assert.deepStrictEqual(range(1, 5), [1, 2, 3, 4, 5])
*
* @category constructors
* @since 2.0.0
*/
exports.range = RA.range;
/**
* Create an array containing a value repeated the specified number of times
*
* @example
* import { replicate } from 'fp-ts/Array'
*
* assert.deepStrictEqual(replicate(3, 'a'), ['a', 'a', 'a'])
*
* @category constructors
* @since 2.0.0
*/
exports.replicate = RA.replicate;
/**
* Removes one level of nesting.
*
* Derivable from `Monad`.
*
* @example
* import { flatten } from 'fp-ts/Array'
*
* assert.deepStrictEqual(flatten([[1], [2], [3]]), [1, 2, 3])
*
* @category combinators
* @since 2.0.0
*/
exports.flatten = RA.flatten;
/**
* Break an array into its first element and remaining elements
*
* @example
* import { foldLeft } from 'fp-ts/Array'
*
* const len: <A>(as: Array<A>) => number = foldLeft(() => 0, (_, tail) => 1 + len(tail))
* assert.strictEqual(len([1, 2, 3]), 3)
*
* @category destructors
* @since 2.0.0
*/
exports.foldLeft = RA.foldLeft;
/**
* Break an array into its initial elements and the last element
*
* @category destructors
* @since 2.0.0
*/
exports.foldRight = RA.foldRight;
/**
* Same as `reduce` but it carries over the intermediate steps
*
* @example
* import { scanLeft } from 'fp-ts/Array'
*
* assert.deepStrictEqual(scanLeft(10, (b, a: number) => b - a)([1, 2, 3]), [10, 9, 7, 4])
*
* @category combinators
* @since 2.0.0
*/
exports.scanLeft = RA.scanLeft;
/**
* Fold an array from the right, keeping all intermediate results instead of only the final result
*
* @example
* import { scanRight } from 'fp-ts/Array'
*
* assert.deepStrictEqual(scanRight(10, (a: number, b) => b - a)([1, 2, 3]), [4, 5, 7, 10])
*
* @category combinators
* @since 2.0.0
*/
exports.scanRight = RA.scanRight;
/**
* Test whether an array is empty
*
* @example
* import { isEmpty } from 'fp-ts/Array'
*
* assert.strictEqual(isEmpty([]), true)
*
* @since 2.0.0
*/
exports.isEmpty = RA.isEmpty;
/**
* Test whether an array is non empty narrowing down the type to `NonEmptyArray<A>`
*
* @category guards
* @since 2.0.0
*/
exports.isNonEmpty = RA.isNonEmpty;
/**
* Test whether an array contains a particular index
*
* @since 2.0.0
*/
exports.isOutOfBound = RA.isOutOfBound;
// TODO: remove non-curried overloading in v3
/**
* This function provides a safe way to read a value at a particular index from an array
*
* @example
* import { lookup } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
* import { pipe } from 'fp-ts/function'
*
* assert.deepStrictEqual(pipe([1, 2, 3], lookup(1)), some(2))
* assert.deepStrictEqual(pipe([1, 2, 3], lookup(3)), none)
*
* @since 2.0.0
*/
exports.lookup = RA.lookup;
// TODO: remove non-curried overloading in v3
/**
* Attaches an element to the front of an array, creating a new non empty array
*
* @example
* import { cons } from 'fp-ts/Array'
* import { pipe } from 'fp-ts/function'
*
* assert.deepStrictEqual(pipe([1, 2, 3], cons(0)), [0, 1, 2, 3])
*
* @category constructors
* @since 2.0.0
*/
exports.cons = RA.cons;
// TODO: curry in v3
/**
* Append an element to the end of an array, creating a new non empty array
*
* @example
* import { snoc } from 'fp-ts/Array'
*
* assert.deepStrictEqual(snoc([1, 2, 3], 4), [1, 2, 3, 4])
*
* @category constructors
* @since 2.0.0
*/
exports.snoc = RA.snoc;
/**
* Get the first element in an array, or `None` if the array is empty
*
* @example
* import { head } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* assert.deepStrictEqual(head([1, 2, 3]), some(1))
* assert.deepStrictEqual(head([]), none)
*
* @category destructors
* @since 2.0.0
*/
exports.head = RA.head;
/**
* Get the last element in an array, or `None` if the array is empty
*
* @example
* import { last } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* assert.deepStrictEqual(last([1, 2, 3]), some(3))
* assert.deepStrictEqual(last([]), none)
*
* @category destructors
* @since 2.0.0
*/
exports.last = RA.last;
/**
* Get all but the first element of an array, creating a new array, or `None` if the array is empty
*
* @example
* import { tail } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* assert.deepStrictEqual(tail([1, 2, 3]), some([2, 3]))
* assert.deepStrictEqual(tail([]), none)
*
* @category destructors
* @since 2.0.0
*/
exports.tail = RA.tail;
/**
* Get all but the last element of an array, creating a new array, or `None` if the array is empty
*
* @example
* import { init } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* assert.deepStrictEqual(init([1, 2, 3]), some([1, 2]))
* assert.deepStrictEqual(init([]), none)
*
* @category destructors
* @since 2.0.0
*/
exports.init = RA.init;
/**
* Keep only a number of elements from the start of an array, creating a new array.
* `n` must be a natural number
*
* @example
* import { takeLeft } from 'fp-ts/Array'
*
* assert.deepStrictEqual(takeLeft(2)([1, 2, 3]), [1, 2])
*
* @category combinators
* @since 2.0.0
*/
exports.takeLeft = RA.takeLeft;
/**
* Keep only a number of elements from the end of an array, creating a new array.
* `n` must be a natural number
*
* @example
* import { takeRight } from 'fp-ts/Array'
*
* assert.deepStrictEqual(takeRight(2)([1, 2, 3, 4, 5]), [4, 5])
*
* @category combinators
* @since 2.0.0
*/
exports.takeRight = RA.takeRight;
function takeLeftWhile(predicate) {
return RA.takeLeftWhile(predicate);
}
exports.takeLeftWhile = takeLeftWhile;
function spanLeft(predicate) {
return RA.spanLeft(predicate);
}
exports.spanLeft = spanLeft;
/* tslint:enable:readonly-keyword */
/**
* Drop a number of elements from the start of an array, creating a new array
*
* @example
* import { dropLeft } from 'fp-ts/Array'
*
* assert.deepStrictEqual(dropLeft(2)([1, 2, 3]), [3])
*
* @category combinators
* @since 2.0.0
*/
exports.dropLeft = RA.dropLeft;
/**
* Drop a number of elements from the end of an array, creating a new array
*
* @example
* import { dropRight } from 'fp-ts/Array'
*
* assert.deepStrictEqual(dropRight(2)([1, 2, 3, 4, 5]), [1, 2, 3])
*
* @category combinators
* @since 2.0.0
*/
exports.dropRight = RA.dropRight;
/**
* Remove the longest initial subarray for which all element satisfy the specified predicate, creating a new array
*
* @example
* import { dropLeftWhile } from 'fp-ts/Array'
*
* assert.deepStrictEqual(dropLeftWhile((n: number) => n % 2 === 1)([1, 3, 2, 4, 5]), [2, 4, 5])
*
* @category combinators
* @since 2.0.0
*/
exports.dropLeftWhile = RA.dropLeftWhile;
/**
* Find the first index for which a predicate holds
*
* @example
* import { findIndex } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* assert.deepStrictEqual(findIndex((n: number) => n === 2)([1, 2, 3]), some(1))
* assert.deepStrictEqual(findIndex((n: number) => n === 2)([]), none)
*
* @since 2.0.0
*/
exports.findIndex = RA.findIndex;
function findFirst(predicate) {
return RA.findFirst(predicate);
}
exports.findFirst = findFirst;
/**
* Find the first element returned by an option based selector function
*
* @example
* import { findFirstMap } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* interface Person {
* name: string
* age?: number
* }
*
* const persons: Array<Person> = [{ name: 'John' }, { name: 'Mary', age: 45 }, { name: 'Joey', age: 28 }]
*
* // returns the name of the first person that has an age
* assert.deepStrictEqual(findFirstMap((p: Person) => (p.age === undefined ? none : some(p.name)))(persons), some('Mary'))
*
* @category destructors
* @since 2.0.0
*/
exports.findFirstMap = RA.findFirstMap;
function findLast(predicate) {
return RA.findLast(predicate);
}
exports.findLast = findLast;
/**
* Find the last element returned by an option based selector function
*
* @example
* import { findLastMap } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* interface Person {
* name: string
* age?: number
* }
*
* const persons: Array<Person> = [{ name: 'John' }, { name: 'Mary', age: 45 }, { name: 'Joey', age: 28 }]
*
* // returns the name of the last person that has an age
* assert.deepStrictEqual(findLastMap((p: Person) => (p.age === undefined ? none : some(p.name)))(persons), some('Joey'))
*
* @category destructors
* @since 2.0.0
*/
exports.findLastMap = RA.findLastMap;
/**
* Returns the index of the last element of the list which matches the predicate
*
* @example
* import { findLastIndex } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* interface X {
* a: number
* b: number
* }
* const xs: Array<X> = [{ a: 1, b: 0 }, { a: 1, b: 1 }]
* assert.deepStrictEqual(findLastIndex((x: { a: number }) => x.a === 1)(xs), some(1))
* assert.deepStrictEqual(findLastIndex((x: { a: number }) => x.a === 4)(xs), none)
*
*
* @since 2.0.0
*/
exports.findLastIndex = RA.findLastIndex;
/**
* @category combinators
* @since 2.0.0
*/
exports.copy = RA.toArray;
/**
* Insert an element at the specified index, creating a new array, or returning `None` if the index is out of bounds
*
* @example
* import { insertAt } from 'fp-ts/Array'
* import { some } from 'fp-ts/Option'
*
* assert.deepStrictEqual(insertAt(2, 5)([1, 2, 3, 4]), some([1, 2, 5, 3, 4]))
*
* @since 2.0.0
*/
exports.insertAt = RA.insertAt;
/**
* Change the element at the specified index, creating a new array, or returning `None` if the index is out of bounds
*
* @example
* import { updateAt } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* assert.deepStrictEqual(updateAt(1, 1)([1, 2, 3]), some([1, 1, 3]))
* assert.deepStrictEqual(updateAt(1, 1)([]), none)
*
* @since 2.0.0
*/
exports.updateAt = RA.updateAt;
/**
* Delete the element at the specified index, creating a new array, or returning `None` if the index is out of bounds
*
* @example
* import { deleteAt } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* assert.deepStrictEqual(deleteAt(0)([1, 2, 3]), some([2, 3]))
* assert.deepStrictEqual(deleteAt(1)([]), none)
*
* @since 2.0.0
*/
exports.deleteAt = RA.deleteAt;
/**
* Apply a function to the element at the specified index, creating a new array, or returning `None` if the index is out
* of bounds
*
* @example
* import { modifyAt } from 'fp-ts/Array'
* import { some, none } from 'fp-ts/Option'
*
* const double = (x: number): number => x * 2
* assert.deepStrictEqual(modifyAt(1, double)([1, 2, 3]), some([1, 4, 3]))
* assert.deepStrictEqual(modifyAt(1, double)([]), none)
*
* @since 2.0.0
*/
exports.modifyAt = RA.modifyAt;
/**
* Reverse an array, creating a new array
*
* @example
* import { reverse } from 'fp-ts/Array'
*
* assert.deepStrictEqual(reverse([1, 2, 3]), [3, 2, 1])
*
* @category combinators
* @since 2.0.0
*/
exports.reverse = RA.reverse;
/**
* Extracts from an array of `Either` all the `Right` elements. All the `Right` elements are extracted in order
*
* @example
* import { rights } from 'fp-ts/Array'
* import { right, left } from 'fp-ts/Either'
*
* assert.deepStrictEqual(rights([right(1), left('foo'), right(2)]), [1, 2])
*
* @category combinators
* @since 2.0.0
*/
exports.rights = RA.rights;
/**
* Extracts from an array of `Either` all the `Left` elements. All the `Left` elements are extracted in order
*
* @example
* import { lefts } from 'fp-ts/Array'
* import { left, right } from 'fp-ts/Either'
*
* assert.deepStrictEqual(lefts([right(1), left('foo'), right(2)]), ['foo'])
*
* @category combinators
* @since 2.0.0
*/
exports.lefts = RA.lefts;
/**
* Sort the elements of an array in increasing order, creating a new array
*
* @example
* import { sort } from 'fp-ts/Array'
* import { ordNumber } from 'fp-ts/Ord'
*
* assert.deepStrictEqual(sort(ordNumber)([3, 2, 1]), [1, 2, 3])
*
* @category combinators
* @since 2.0.0
*/
exports.sort = RA.sort;
/**
* Apply a function to pairs of elements at the same index in two arrays, collecting the results in a new array. If one
* input array is short, excess elements of the longer array are discarded.
*
* @example
* import { zipWith } from 'fp-ts/Array'
*
* assert.deepStrictEqual(zipWith([1, 2, 3], ['a', 'b', 'c', 'd'], (n, s) => s + n), ['a1', 'b2', 'c3'])
*
* @category combinators
* @since 2.0.0
*/
exports.zipWith = RA.zipWith;
// TODO: remove non-curried overloading in v3
/**
* Takes two arrays and returns an array of corresponding pairs. If one input array is short, excess elements of the
* longer array are discarded
*
* @example
* import { zip } from 'fp-ts/Array'
* import { pipe } from 'fp-ts/function'
*
* assert.deepStrictEqual(pipe([1, 2, 3], zip(['a', 'b', 'c', 'd'])), [[1, 'a'], [2, 'b'], [3, 'c']])
*
* @category combinators
* @since 2.0.0
*/
exports.zip = RA.zip;
/**
* The function is reverse of `zip`. Takes an array of pairs and return two corresponding arrays
*
* @example
* import { unzip } from 'fp-ts/Array'
*
* assert.deepStrictEqual(unzip([[1, 'a'], [2, 'b'], [3, 'c']]), [[1, 2, 3], ['a', 'b', 'c']])
*
* @since 2.0.0
*/
exports.unzip = RA.unzip;
/**
* Prepend an element to every member of an array
*
* @example
* import { prependToAll } from 'fp-ts/Array'
*
* assert.deepStrictEqual(prependToAll(9)([1, 2, 3, 4]), [9, 1, 9, 2, 9, 3, 9, 4])
*
* @category combinators
* @since 2.9.0
*/
exports.prependToAll = RA.prependToAll;
/**
* Places an element in between members of an array
*
* @example
* import { intersperse } from 'fp-ts/Array'
*
* assert.deepStrictEqual(intersperse(9)([1, 2, 3, 4]), [1, 9, 2, 9, 3, 9, 4])
*
* @category combinators
* @since 2.9.0
*/
exports.intersperse = RA.intersperse;
/**
* Rotate an array to the right by `n` steps
*
* @example
* import { rotate } from 'fp-ts/Array'
*
* assert.deepStrictEqual(rotate(2)([1, 2, 3, 4, 5]), [4, 5, 1, 2, 3])
*
* @category combinators
* @since 2.0.0
*/
exports.rotate = RA.rotate;
// TODO: remove non-curried overloading in v3
/**
* Test if a value is a member of an array. Takes a `Eq<A>` as a single
* argument which returns the function to use to search for a value of type `A` in
* an array of type `Array<A>`.
*
* @example
* import { elem } from 'fp-ts/Array'
* import { eqNumber } from 'fp-ts/Eq'
* import { pipe } from 'fp-ts/function'
*
* assert.strictEqual(pipe([1, 2, 3], elem(eqNumber)(2)), true)
* assert.strictEqual(pipe([1, 2, 3], elem(eqNumber)(0)), false)
*
* @since 2.0.0
*/
exports.elem = RA.elem;
/**
* Remove duplicates from an array, keeping the first occurrence of an element.
*
* @example
* import { uniq } from 'fp-ts/Array'
* import { eqNumber } from 'fp-ts/Eq'
*
* assert.deepStrictEqual(uniq(eqNumber)([1, 2, 1]), [1, 2])
*
* @category combinators
* @since 2.0.0
*/
exports.uniq = RA.uniq;
/**
* Sort the elements of an array in increasing order, where elements are compared using first `ords[0]`, then `ords[1]`,
* etc...
*
* @example
* import { sortBy } from 'fp-ts/Array'
* import { ord, ordString, ordNumber } from 'fp-ts/Ord'
*
* interface Person {
* name: string
* age: number
* }
* const byName = ord.contramap(ordString, (p: Person) => p.name)
* const byAge = ord.contramap(ordNumber, (p: Person) => p.age)
*
* const sortByNameByAge = sortBy([byName, byAge])
*
* const persons = [{ name: 'a', age: 1 }, { name: 'b', age: 3 }, { name: 'c', age: 2 }, { name: 'b', age: 2 }]
* assert.deepStrictEqual(sortByNameByAge(persons), [
* { name: 'a', age: 1 },
* { name: 'b', age: 2 },
* { name: 'b', age: 3 },
* { name: 'c', age: 2 }
* ])
*
* @category combinators
* @since 2.0.0
*/
exports.sortBy = RA.sortBy;
/**
* A useful recursion pattern for processing an array to produce a new array, often used for "chopping" up the input
* array. Typically chop is called with some function that will consume an initial prefix of the array and produce a
* value and the rest of the array.
*
* @example
* import { Eq, eqNumber } from 'fp-ts/Eq'
* import { chop, spanLeft } from 'fp-ts/Array'
*
* const group = <A>(S: Eq<A>): ((as: Array<A>) => Array<Array<A>>) => {
* return chop(as => {
* const { init, rest } = spanLeft((a: A) => S.equals(a, as[0]))(as)
* return [init, rest]
* })
* }
* assert.deepStrictEqual(group(eqNumber)([1, 1, 2, 3, 3, 4]), [[1, 1], [2], [3, 3], [4]])
*
* @category combinators
* @since 2.0.0
*/
exports.chop = RA.chop;
/**
* Splits an array into two pieces, the first piece has `n` elements.
*
* @example
* import { splitAt } from 'fp-ts/Array'
*
* assert.deepStrictEqual(splitAt(2)([1, 2, 3, 4, 5]), [[1, 2], [3, 4, 5]])
*
* @since 2.0.0
*/
exports.splitAt = RA.splitAt;
/**
* Splits an array into length-`n` pieces. The last piece will be shorter if `n` does not evenly divide the length of
* the array. Note that `chunksOf(n)([])` is `[]`, not `[[]]`. This is intentional, and is consistent with a recursive
* definition of `chunksOf`; it satisfies the property that
*
* ```ts
* chunksOf(n)(xs).concat(chunksOf(n)(ys)) == chunksOf(n)(xs.concat(ys)))
* ```
*
* whenever `n` evenly divides the length of `xs`.
*
* @example
* import { chunksOf } from 'fp-ts/Array'
*
* assert.deepStrictEqual(chunksOf(2)([1, 2, 3, 4, 5]), [[1, 2], [3, 4], [5]])
*
* @since 2.0.0
*/
exports.chunksOf = RA.chunksOf;
function comprehension(input, f, g) {
if (g === void 0) { g = function () { return true; }; }
return RA.comprehension(input, f, g);
}
exports.comprehension = comprehension;
// TODO: remove non-curried overloading in v3
/**
* Creates an array of unique values, in order, from all given arrays using a `Eq` for equality comparisons
*
* @example
* import { union } from 'fp-ts/Array'
* import { eqNumber } from 'fp-ts/Eq'
* import { pipe } from 'fp-ts/function'
*
* assert.deepStrictEqual(pipe([1, 2], union(eqNumber)([2, 3])), [1, 2, 3])
*
* @category combinators
* @since 2.0.0
*/
exports.union = RA.union;
// TODO: remove non-curried overloading in v3
/**
* Creates an array of unique values that are included in all given arrays using a `Eq` for equality
* comparisons. The order and references of result values are determined by the first array.
*
* @example
* import { intersection } from 'fp-ts/Array'
* import { eqNumber } from 'fp-ts/Eq'
* import { pipe } from 'fp-ts/function'
*
* assert.deepStrictEqual(pipe([1, 2], intersection(eqNumber)([2, 3])), [2])
*
* @category combinators
* @since 2.0.0
*/
exports.intersection = RA.intersection;
// TODO: remove non-curried overloading in v3
/**
* Creates an array of array values not included in the other given array using a `Eq` for equality
* comparisons. The order and references of result values are determined by the first array.
*
* @example
* import { difference } from 'fp-ts/Array'
* import { eqNumber } from 'fp-ts/Eq'
* import { pipe } from 'fp-ts/function'
*
* assert.deepStrictEqual(pipe([1, 2], difference(eqNumber)([2, 3])), [1])
*
* @category combinators
* @since 2.0.0
*/
exports.difference = RA.difference;
/**
* Wrap a value into the type constructor.
*
* @category Applicative
* @since 2.0.0
*/
exports.of = RA.of;
// -------------------------------------------------------------------------------------
// non-pipeables
// -------------------------------------------------------------------------------------
var map_ = RA.Monad.map;
var ap_ = RA.Monad.ap;
var chain_ = RA.Monad.chain;
var mapWithIndex_ = RA.FunctorWithIndex.mapWithIndex;
var filter_ = RA.Filterable.filter;
var filterMap_ = RA.Filterable.filterMap;
var partition_ = RA.Filterable.partition;
var partitionMap_ = RA.Filterable.partitionMap;
var filterWithIndex_ = RA.FilterableWithIndex
.filterWithIndex;
var filterMapWithIndex_ = RA.FilterableWithIndex
.filterMapWithIndex;
var partitionWithIndex_ = RA.FilterableWithIndex
.partitionWithIndex;
var partitionMapWithIndex_ = RA.FilterableWithIndex
.partitionMapWithIndex;
var reduce_ = RA.Foldable.reduce;
var foldMap_ = RA.Foldable.foldMap;
var reduceRight_ = RA.Foldable.reduceRight;
var traverse_ = RA.Traversable.traverse;
var alt_ = RA.Alternative.alt;
var reduceWithIndex_ = RA.FoldableWithIndex.reduceWithIndex;
var foldMapWithIndex_ = RA.FoldableWithIndex.foldMapWithIndex;
var reduceRightWithIndex_ = RA.FoldableWithIndex.reduceRightWithIndex;
var traverseWithIndex_ = RA.TraversableWithIndex
.traverseWithIndex;
var extend_ = RA.Extend.extend;
var wither_ = RA.Witherable.wither;
var wilt_ = RA.Witherable.wilt;
// -------------------------------------------------------------------------------------
// pipeables
// -------------------------------------------------------------------------------------
/**
* `map` can be used to turn functions `(a: A) => B` into functions `(fa: F<A>) => F<B>` whose argument and return types
* use the type constructor `F` to represent some computational context.
*
* @category Functor
* @since 2.0.0
*/
exports.map = RA.map;
/**
* Apply a function to an argument under a type constructor.
*
* @category Apply
* @since 2.0.0
*/
exports.ap = RA.ap;
/**
* Combine two effectful actions, keeping only the result of the first.
*
* Derivable from `Apply`.
*
* @category combinators
* @since 2.0.0
*/
exports.apFirst = RA.apFirst;
/**
* Combine two effectful actions, keeping only the result of the second.
*
* Derivable from `Apply`.
*
* @category combinators
* @since 2.0.0
*/
exports.apSecond = RA.apSecond;
/**
* Composes computations in sequence, using the return value of one computation to determine the next computation.
*
* @category Monad
* @since 2.0.0
*/
exports.chain = RA.chain;
/**
* @since 2.7.0
*/
exports.chainWithIndex = RA.chainWithIndex;
/**
* Composes computations in sequence, using the return value of one computation to determine the next computation and
* keeping only the result of the first.
*
* Derivable from `Monad`.
*
* @category combinators
* @since 2.0.0
*/
exports.chainFirst = RA.chainFirst;
/**
* @category FunctorWithIndex
* @since 2.0.0
*/
exports.mapWithIndex = RA.mapWithIndex;
/**
* @category Compactable
* @since 2.0.0
*/
exports.compact = RA.compact;
/**
* @category Compactable
* @since 2.0.0
*/
exports.separate = RA.separate;
/**
* @category Filterable
* @since 2.0.0
*/
exports.filter = RA.filter;
/**
* @category Filterable
* @since 2.0.0
*/
exports.filterMap = RA.filterMap;
/**
* @category Filterable
* @since 2.0.0
*/
exports.partition = RA.partition;
/**
* @category FilterableWithIndex
* @since 2.0.0
*/
exports.partitionWithIndex = RA.partitionWithIndex;
/**
* @category Filterable
* @since 2.0.0
*/
exports.partitionMap = RA.partitionMap;
/**
* @category FilterableWithIndex
* @since 2.0.0
*/
exports.partitionMapWithIndex = RA.partitionMapWithIndex;
/**
* Less strict version of [`alt`](#alt).
*
* @category Alt
* @since 2.9.0
*/
exports.altW = RA.altW;
/**
* Identifies an associative operation on a type constructor. It is similar to `Semigroup`, except that it applies to
* types of kind `* -> *`.
*
* @category Alt
* @since 2.0.0
*/
exports.alt = RA.alt;
/**
* @category FilterableWithIndex
* @since 2.0.0
*/
exports.filterMapWithIndex = RA.filterMapWithIndex;
/**
* @category FilterableWithIndex
* @since 2.0.0
*/
exports.filterWithIndex = RA.filterWithIndex;
/**
* @category Extend
* @since 2.0.0
*/
exports.extend = RA.extend;
/**
* Derivable from `Extend`.
*
* @category combinators
* @since 2.0.0
*/
exports.duplicate = RA.duplicate;
/**
* @category Foldable
* @since 2.0.0
*/
exports.foldMap = RA.foldMap;
/**
* @category FoldableWithIndex
* @since 2.0.0
*/
exports.foldMapWithIndex = RA.foldMapWithIndex;
/**
* @category Foldable
* @since 2.0.0
*/
exports.reduce = RA.reduce;
/**
* @category FoldableWithIndex
* @since 2.0.0
*/
exports.reduceWithIndex = RA.reduceWithIndex;
/**
* @category Foldable
* @since 2.0.0
*/
exports.reduceRight = RA.reduceRight;
/**
* @category FoldableWithIndex
* @since 2.0.0
*/
exports.reduceRightWithIndex = RA.reduceRightWithIndex;
/**
* **for optimized and stack safe version check the data types `traverseArray` function**
* @category Traversable
* @since 2.6.3
*/
exports.traverse = RA.traverse;
/**
* **for optimized and stack safe version check the data types `sequenceArray` function**
* @category Traversable
* @since 2.6.3
*/
exports.sequence = RA.sequence;
/**
* **for optimized and stack safe version check the data types `traverseArrayWithIndex` function**
* @category TraversableWithIndex
* @since 2.6.3
*/
exports.traverseWithIndex = RA.traverseWithIndex;
/**
* @category Witherable
* @since 2.6.5
*/
exports.wither = RA.wither;
/**
* @category Witherable
* @since 2.6.5
*/
exports.wilt = RA.wilt;
/**
* @category Unfoldable
* @since 2.6.6
*/
exports.unfold = RA.unfold;
/**
* @category Alternative
* @since 2.7.0
*/
exports.zero = RA.Alternative.zero;
// -------------------------------------------------------------------------------------
// instances
// -------------------------------------------------------------------------------------
/**
* @category instances
* @since 2.0.0
*/
exports.URI = 'Array';
/**
* @category instances
* @since 2.7.0
*/
exports.Functor = {
URI: exports.URI,
map: map_
};
/**
* @category instances
* @since 2.7.0
*/
exports.FunctorWithIndex = {
URI: exports.URI,
map: map_,
mapWithIndex: mapWithIndex_
};
/**
* @category instances
* @since 2.7.0
*/
exports.Applicative = {
URI: exports.URI,
map: map_,
ap: ap_,
of: exports.of
};
/**
* @category instances
* @since 2.7.0
*/
exports.Monad = {
URI: exports.URI,
map: map_,
ap: ap_,
of: exports.of,
chain: chain_
};
/**
* @category instances
* @since 2.7.0
*/
exports.Unfoldable = {
URI: exports.URI,
unfold: exports.unfold
};
/**
* @category instances
* @since 2.7.0
*/
exports.Alt = {
URI: exports.URI,
map: map_,
alt: alt_
};
/**
* @category instances
* @since 2.7.0
*/
exports.Alternative = {
URI: exports.URI,
map: map_,
ap: ap_,
of: exports.of,
alt: alt_,
zero: exports.zero
};
/**
* @category instances
* @since 2.7.0
*/
exports.Extend = {
URI: exports.URI,
map: map_,
extend: extend_
};
/**
* @category instances
* @since 2.7.0
*/
exports.Compactable = {
URI: exports.URI,
compact: exports.compact,
separate: exports.separate
};
/**
* @category instances
* @since 2.7.0
*/
exports.Filterable = {
URI: exports.URI,
map: map_,
compact: exports.compact,
separate: exports.separate,
filter: filter_,
filterMap: filterMap_,
partition: partition_,
partitionMap: partitionMap_
};
/**
* @category instances
* @since 2.7.0
*/
exports.FilterableWithIndex = {
URI: exports.URI,
map: map_,
mapWithIndex: mapWithIndex_,
compact: exports.compact,
separate: exports.separate,
filter: filter_,
filterMap: filterMap_,
partition: partition_,
partitionMap: partitionMap_,
partitionMapWithIndex: partitionMapWithIndex_,
partitionWithIndex: partitionWithIndex_,
filterMapWithIndex: filterMapWithIndex_,
filterWithIndex: filterWithIndex_
};
/**
* @category instances
* @since 2.7.0
*/
exports.Foldable = {
URI: exports.URI,
reduce: reduce_,
foldMap: foldMap_,
reduceRight: reduceRight_
};
/**
* @category instances
* @since 2.7.0
*/
exports.FoldableWithIndex = {
URI: exports.URI,
reduce: reduce_,
foldMap: foldMap_,
reduceRight: reduceRight_,
reduceWithIndex: reduceWithIndex_,
foldMapWithIndex: foldMapWithIndex_,
reduceRightWithIndex: reduceRightWithIndex_
};
/**
* @category instances
* @since 2.7.0
*/
exports.Traversable = {
URI: exports.URI,
map: map_,
reduce: reduce_,
foldMap: foldMap_,
reduceRight: reduceRight_,
traverse: traverse_,
sequence: exports.sequence
};
/**
* @category instances
* @since 2.7.0
*/
exports.TraversableWithIndex = {
URI: exports.URI,
map: map_,
mapWithIndex: mapWithIndex_,
reduce: reduce_,
foldMap: foldMap_,
reduceRight: reduceRight_,
reduceWithIndex: reduceWithIndex_,
foldMapWithIndex: foldMapWithIndex_,
reduceRightWithIndex: reduceRightWithIndex_,
traverse: traverse_,
sequence: exports.sequence,
traverseWithIndex: traverseWithIndex_
};
/**
* @category instances
* @since 2.7.0
*/
exports.Witherable = {
URI: exports.URI,
map: map_,
compact: exports.compact,
separate: exports.separate,
filter: filter_,
filterMap: filterMap_,
partition: partition_,
partitionMap: partitionMap_,
reduce: reduce_,
foldMap: foldMap_,
reduceRight: reduceRight_,
traverse: traverse_,
sequence: exports.sequence,
wither: wither_,
wilt: wilt_
};
// TODO: remove in v3
/**
* @category instances
* @since 2.0.0
*/
exports.array = {
URI: exports.URI,
compact: exports.compact,
separate: exports.separate,
map: map_,
ap: ap_,
of: exports.of,
chain: chain_,
filter: filter_,
filterMap: filterMap_,
partition: partition_,
partitionMap: partitionMap_,
mapWithIndex: mapWithIndex_,
partitionMapWithIndex: partitionMapWithIndex_,
partitionWithIndex: partitionWithIndex_,
filterMapWithIndex: filterMapWithIndex_,
filterWithIndex: filterWithIndex_,
alt: alt_,
zero: exports.zero,
unfold: exports.unfold,
reduce: reduce_,
foldMap: foldMap_,
reduceRight: reduceRight_,
traverse: traverse_,
sequence: exports.sequence,
reduceWithIndex: reduceWithIndex_,
foldMapWithIndex: foldMapWithIndex_,
reduceRightWithIndex: reduceRightWithIndex_,
traverseWithIndex: traverseWithIndex_,
extend: extend_,
wither: wither_,
wilt: wilt_
};
// -------------------------------------------------------------------------------------
// unsafe
// -------------------------------------------------------------------------------------
/**
* @category unsafe
* @since 2.0.0
*/
exports.unsafeInsertAt = RA.unsafeInsertAt;
/**
* @category unsafe
* @since 2.0.0
*/
exports.unsafeUpdateAt = RA.unsafeUpdateAt;
/**
* @category unsafe
* @since 2.0.0
*/
exports.unsafeDeleteAt = RA.unsafeDeleteAt;
// -------------------------------------------------------------------------------------
// utils
// -------------------------------------------------------------------------------------
/**
* An empty array
*
* @since 2.0.0
*/
exports.empty = [];
/**
* @since 2.9.0
*/
exports.every = RA.every;
/**
* @since 2.9.0
*/
exports.some = RA.some;
// -------------------------------------------------------------------------------------
// do notation
// -------------------------------------------------------------------------------------
/**
* @since 2.9.0
*/
exports.Do =
/*#__PURE__*/
exports.of({});
/**
* @since 2.8.0
*/
exports.bindTo = RA.bindTo;
/**
* @since 2.8.0
*/
exports.bind = RA.bind;
// -------------------------------------------------------------------------------------
// pipeable sequence S
// -------------------------------------------------------------------------------------
/**
* @since 2.8.0
*/
exports.apS = RA.apS;