UNPKG

fp-ts

Version:

Functional programming in TypeScript

429 lines (428 loc) 10.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.filterMap = exports.separate = exports.compact = exports.fromArray = exports.remove = exports.insert = exports.singleton = exports.foldMap = exports.reduce = exports.getIntersectionSemigroup = exports.getUnionMonoid = exports.difference = exports.partitionMap = exports.intersection = exports.union = exports.elem = exports.partition = exports.filter = exports.isSubset = exports.chain = exports.every = exports.map = exports.some = exports.getEq = exports.toReadonlyArray = exports.empty = exports.getShow = exports.toSet = exports.fromSet = void 0; var Eq_1 = require("./Eq"); var function_1 = require("./function"); /** * @category constructors * @since 2.5.0 */ function fromSet(s) { return new Set(s); } exports.fromSet = fromSet; /** * @category destructors * @since 2.5.0 */ function toSet(s) { return new Set(s); } exports.toSet = toSet; /** * @category instances * @since 2.5.0 */ function getShow(S) { return { show: function (s) { var elements = ''; s.forEach(function (a) { elements += S.show(a) + ', '; }); if (elements !== '') { elements = elements.substring(0, elements.length - 2); } return "new Set([" + elements + "])"; } }; } exports.getShow = getShow; /** * @since 2.5.0 */ exports.empty = new Set(); /** * @category destructors * @since 2.5.0 */ function toReadonlyArray(O) { return function (x) { // tslint:disable-next-line: readonly-array var r = []; x.forEach(function (e) { return r.push(e); }); return r.sort(O.compare); }; } exports.toReadonlyArray = toReadonlyArray; /** * @category instances * @since 2.5.0 */ function getEq(E) { var subsetE = isSubset(E); return Eq_1.fromEquals(function (x, y) { return subsetE(x, y) && subsetE(y, x); }); } exports.getEq = getEq; /** * @since 2.5.0 */ function some(predicate) { return function (set) { var values = set.values(); var e; var found = false; // tslint:disable-next-line: strict-boolean-expressions while (!found && !(e = values.next()).done) { found = predicate(e.value); } return found; }; } exports.some = some; /** * Projects a Set through a function * * @category combinators * @since 2.5.0 */ function map(E) { var elemE = elem(E); return function (f) { return function (set) { var r = new Set(); set.forEach(function (e) { var v = f(e); if (!elemE(v, r)) { r.add(v); } }); return r; }; }; } exports.map = map; /** * @since 2.5.0 */ function every(predicate) { return function_1.not(some(function_1.not(predicate))); } exports.every = every; /** * @category combinators * @since 2.5.0 */ function chain(E) { var elemE = elem(E); return function (f) { return function (set) { var r = new Set(); set.forEach(function (e) { f(e).forEach(function (e) { if (!elemE(e, r)) { r.add(e); } }); }); return r; }; }; } exports.chain = chain; function isSubset(E) { var elemE = elem(E); return function (me, that) { if (that === undefined) { var isSubsetE_1 = isSubset(E); return function (that) { return isSubsetE_1(that, me); }; } return every(function (a) { return elemE(a, that); })(me); }; } exports.isSubset = isSubset; function filter(predicate) { return function (set) { var values = set.values(); var e; var r = new Set(); // tslint:disable-next-line: strict-boolean-expressions while (!(e = values.next()).done) { var value = e.value; if (predicate(value)) { r.add(value); } } return r; }; } exports.filter = filter; function partition(predicate) { return function (set) { var values = set.values(); var e; var right = new Set(); var left = new Set(); // tslint:disable-next-line: strict-boolean-expressions while (!(e = values.next()).done) { var value = e.value; if (predicate(value)) { right.add(value); } else { left.add(value); } } return { left: left, right: right }; }; } exports.partition = partition; function elem(E) { return function (a, set) { if (set === undefined) { var elemE_1 = elem(E); return function (set) { return elemE_1(a, set); }; } var values = set.values(); var e; var found = false; // tslint:disable-next-line: strict-boolean-expressions while (!found && !(e = values.next()).done) { found = E.equals(a, e.value); } return found; }; } exports.elem = elem; function union(E) { var elemE = elem(E); return function (me, that) { if (that === undefined) { var unionE_1 = union(E); return function (that) { return unionE_1(me, that); }; } if (me === exports.empty) { return that; } if (that === exports.empty) { return me; } var r = new Set(me); that.forEach(function (e) { if (!elemE(e, r)) { r.add(e); } }); return r; }; } exports.union = union; function intersection(E) { var elemE = elem(E); return function (me, that) { if (that === undefined) { var intersectionE_1 = intersection(E); return function (that) { return intersectionE_1(that, me); }; } if (me === exports.empty || that === exports.empty) { return exports.empty; } var r = new Set(); me.forEach(function (e) { if (elemE(e, that)) { r.add(e); } }); return r; }; } exports.intersection = intersection; /** * @since 2.5.0 */ function partitionMap(EB, EC) { return function (f) { return function (set) { var values = set.values(); var e; var left = new Set(); var right = new Set(); var hasB = elem(EB); var hasC = elem(EC); // tslint:disable-next-line: strict-boolean-expressions while (!(e = values.next()).done) { var v = f(e.value); switch (v._tag) { case 'Left': if (!hasB(v.left, left)) { left.add(v.left); } break; case 'Right': if (!hasC(v.right, right)) { right.add(v.right); } break; } } return { left: left, right: right }; }; }; } exports.partitionMap = partitionMap; function difference(E) { var elemE = elem(E); return function (me, that) { if (that === undefined) { var differenceE_1 = difference(E); return function (that) { return differenceE_1(that, me); }; } return filter(function (a) { return !elemE(a, that); })(me); }; } exports.difference = difference; /** * @category instances * @since 2.5.0 */ function getUnionMonoid(E) { return { concat: union(E), empty: exports.empty }; } exports.getUnionMonoid = getUnionMonoid; /** * @category instances * @since 2.5.0 */ function getIntersectionSemigroup(E) { return { concat: intersection(E) }; } exports.getIntersectionSemigroup = getIntersectionSemigroup; /** * @since 2.5.0 */ function reduce(O) { var toArrayO = toReadonlyArray(O); return function (b, f) { return function (fa) { return toArrayO(fa).reduce(f, b); }; }; } exports.reduce = reduce; /** * @since 2.5.0 */ function foldMap(O, M) { var toArrayO = toReadonlyArray(O); return function (f) { return function (fa) { return toArrayO(fa).reduce(function (b, a) { return M.concat(b, f(a)); }, M.empty); }; }; } exports.foldMap = foldMap; /** * Create a set with one element * * @category constructors * @since 2.5.0 */ function singleton(a) { return new Set([a]); } exports.singleton = singleton; /** * Insert a value into a set * * @category combinators * @since 2.5.0 */ function insert(E) { var elemE = elem(E); return function (a) { return function (set) { if (!elemE(a)(set)) { var r = new Set(set); r.add(a); return r; } else { return set; } }; }; } exports.insert = insert; /** * Delete a value from a set * * @category combinators * @since 2.5.0 */ function remove(E) { return function (a) { return function (set) { return filter(function (ax) { return !E.equals(a, ax); })(set); }; }; } exports.remove = remove; /** * Create a set from an array * * @category constructors * @since 2.5.0 */ function fromArray(E) { return function (as) { var len = as.length; var r = new Set(); var has = elem(E); for (var i = 0; i < len; i++) { var a = as[i]; if (!has(a, r)) { r.add(a); } } return r; }; } exports.fromArray = fromArray; /** * @category combinators * @since 2.5.0 */ function compact(E) { return filterMap(E)(function_1.identity); } exports.compact = compact; /** * @since 2.5.0 */ function separate(EE, EA) { return function (fa) { var elemEE = elem(EE); var elemEA = elem(EA); var left = new Set(); var right = new Set(); fa.forEach(function (e) { switch (e._tag) { case 'Left': if (!elemEE(e.left, left)) { left.add(e.left); } break; case 'Right': if (!elemEA(e.right, right)) { right.add(e.right); } break; } }); return { left: left, right: right }; }; } exports.separate = separate; /** * @category combinators * @since 2.5.0 */ function filterMap(E) { var elemE = elem(E); return function (f) { return function (fa) { var r = new Set(); fa.forEach(function (a) { var ob = f(a); if (ob._tag === 'Some' && !elemE(ob.value, r)) { r.add(ob.value); } }); return r; }; }; } exports.filterMap = filterMap;