UNPKG

fp-ts-std

Version:

The missing pseudo-standard library for fp-ts.

118 lines (117 loc) 5.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.toMap = exports.fromMap = exports.Monoid = exports.Semigroup = exports.concatBy = exports.size = exports.values = exports.keys = exports.deleteAt = exports.appendAt = exports.setParam = exports.upsertAt = exports.getAllForParam = exports.lookup = exports.getParam = exports.lookupFirst = exports.isURLSearchParams = exports.clone = exports.Eq = exports.toRecord = exports.fromRecord = exports.toTuples = exports.singleton = exports.fromTuples = exports.toLeadingString = exports.toString = exports.fromString = exports.isEmpty = exports.empty = void 0; const M = require("fp-ts/Map"); const NEA = require("fp-ts/NonEmptyArray"); const O = require("fp-ts/Option"); const Predicate_1 = require("fp-ts/Predicate"); const R = require("fp-ts/Record"); const function_1 = require("fp-ts/function"); const Function_1 = require("./Function"); const A = require("fp-ts/Array"); const Tuple_1 = require("fp-ts/Tuple"); const Str = require("fp-ts/string"); const Array_1 = require("./Array"); const String_1 = require("./String"); const Tuple_2 = require("./Tuple"); const constructor = (x) => new URLSearchParams(x); exports.empty = constructor(undefined); const isEmpty = u => Array.from(u.keys()).length === 0; exports.isEmpty = isEmpty; exports.fromString = constructor; const toString = (x) => x.toString(); exports.toString = toString; exports.toLeadingString = (0, function_1.flow)(exports.toString, (0, Function_1.when)((0, Predicate_1.not)(Str.isEmpty))((0, String_1.prepend)("?"))); exports.fromTuples = constructor; const singleton = (k) => (v) => (0, exports.fromTuples)([[k, v]]); exports.singleton = singleton; const toTuples = (x) => (0, function_1.pipe)(x.entries(), Array_1.fromIterable); exports.toTuples = toTuples; exports.fromRecord = (0, function_1.flow)(R.foldMapWithIndex(Str.Ord)(A.getMonoid())((k, vs) => (0, function_1.pipe)(vs, A.map((0, Tuple_2.withFst)(k)))), exports.fromTuples); const toRecord = (x) => R.fromFoldableMap(NEA.getSemigroup(), A.Foldable)((0, exports.toTuples)(x), (0, Tuple_1.mapSnd)(NEA.of)); exports.toRecord = toRecord; const EqValues = (0, Array_1.getDisorderedEq)(Str.Ord); exports.Eq = { equals: (xs, ys) => { if ((0, exports.size)(xs) !== (0, exports.size)(ys)) return false; const ks = (0, function_1.pipe)(xs, exports.keys, A.concat((0, exports.keys)(ys)), A.uniq(Str.Eq)); for (const k of ks) { const mxvs = (0, exports.lookup)(k)(xs); const myvs = (0, exports.lookup)(k)(ys); if (O.isNone(mxvs) || O.isNone(myvs)) return false; if (!EqValues.equals(mxvs.value, myvs.value)) return false; } return true; }, }; exports.clone = constructor; exports.isURLSearchParams = (0, Function_1.isInstanceOf)(URLSearchParams); const lookupFirst = (k) => (0, function_1.flow)((0, Function_1.invoke)("get")([k]), O.fromNullable); exports.lookupFirst = lookupFirst; exports.getParam = exports.lookupFirst; const lookup = (k) => (0, function_1.flow)((0, Function_1.invoke)("getAll")([k]), NEA.fromArray); exports.lookup = lookup; exports.getAllForParam = exports.lookup; const upsertAt = (k) => (v) => (x) => { const y = (0, exports.clone)(x); y.set(k, v); return y; }; exports.upsertAt = upsertAt; exports.setParam = exports.upsertAt; const appendAt = (k) => (v) => (x) => { const y = (0, exports.clone)(x); y.append(k, v); return y; }; exports.appendAt = appendAt; const deleteAt = (k) => x => { const y = (0, exports.clone)(x); y.delete(k); return y; }; exports.deleteAt = deleteAt; const keys = (x) => (0, Array_1.fromIterable)(x.keys()); exports.keys = keys; const values = (x) => (0, Array_1.fromIterable)(x.values()); exports.values = values; const size = (x) => x.size; exports.size = size; const concatBy = (f) => (xs) => ys => { const zs = (0, exports.clone)(exports.empty); const ks = (0, function_1.pipe)(xs, exports.keys, A.concat((0, exports.keys)(ys)), A.uniq(Str.Eq)); for (const k of ks) { const xvs = xs.getAll(k); const yvs = ys.getAll(k); const zvs = A.isNonEmpty(xvs) && A.isNonEmpty(yvs) ? f(k)([xvs, yvs]) : A.concat(yvs)(xvs); for (const zv of zvs) zs.append(k, zv); } return zs; }; exports.concatBy = concatBy; exports.Semigroup = { concat: (x, y) => (0, exports.concatBy)((0, function_1.constant)((0, Function_1.uncurry2)(A.concat)))(x)(y), }; exports.Monoid = { ...exports.Semigroup, empty: exports.empty, }; exports.fromMap = (0, function_1.flow)(M.foldMapWithIndex(Str.Ord)(A.getMonoid())((k, vs) => (0, function_1.pipe)(vs, A.map((0, Tuple_2.withFst)(k)))), exports.fromTuples); const toMap = (x) => { const m = new Map(); for (const [k, v] of x.entries()) { const prev = M.lookup(Str.Eq)(k)(m); if (O.isSome(prev)) m.set(k, A.append(v)(prev.value)); else m.set(k, NEA.of(v)); } return m; }; exports.toMap = toMap;