fp-ts-std
Version:
The missing pseudo-standard library for fp-ts.
118 lines (117 loc) • 5.1 kB
JavaScript
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;
;