forked from dienianindya/gsi_ess_mobile
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.6 KiB
87 lines
2.6 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.nullsafeVisitor = exports.mapObject = exports.partitionRecord = exports.partition = exports.assertExhaustive = exports.zipIn = exports.zip = exports.reduceFlat = exports.flatten = exports.flattenArray = exports.flattenObject = void 0;
|
|
function* flattenObject(obj) {
|
|
function* helper(path, obj) {
|
|
for (const [k, v] of Object.entries(obj)) {
|
|
if (typeof v !== "object" || v === null) {
|
|
yield [[...path, k].join("."), v];
|
|
}
|
|
else {
|
|
yield* helper([...path, k], v);
|
|
}
|
|
}
|
|
}
|
|
yield* helper([], obj);
|
|
}
|
|
exports.flattenObject = flattenObject;
|
|
function* flattenArray(arr) {
|
|
for (const val of arr) {
|
|
if (Array.isArray(val)) {
|
|
yield* flattenArray(val);
|
|
}
|
|
else {
|
|
yield val;
|
|
}
|
|
}
|
|
}
|
|
exports.flattenArray = flattenArray;
|
|
function flatten(objOrArr) {
|
|
if (Array.isArray(objOrArr)) {
|
|
return flattenArray(objOrArr);
|
|
}
|
|
else {
|
|
return flattenObject(objOrArr);
|
|
}
|
|
}
|
|
exports.flatten = flatten;
|
|
function reduceFlat(accum, next) {
|
|
return [...(accum || []), ...flatten([next])];
|
|
}
|
|
exports.reduceFlat = reduceFlat;
|
|
function* zip(left, right) {
|
|
if (left.length !== right.length) {
|
|
throw new Error("Cannot zip between two lists of differen lengths");
|
|
}
|
|
for (let i = 0; i < left.length; i++) {
|
|
yield [left[i], right[i]];
|
|
}
|
|
}
|
|
exports.zip = zip;
|
|
const zipIn = (other) => (elem, ndx) => {
|
|
return [elem, other[ndx]];
|
|
};
|
|
exports.zipIn = zipIn;
|
|
function assertExhaustive(val) {
|
|
throw new Error(`Never has a value (${val}). This should be impossible`);
|
|
}
|
|
exports.assertExhaustive = assertExhaustive;
|
|
function partition(arr, predicate) {
|
|
return arr.reduce((acc, elem) => {
|
|
acc[predicate(elem) ? 0 : 1].push(elem);
|
|
return acc;
|
|
}, [[], []]);
|
|
}
|
|
exports.partition = partition;
|
|
function partitionRecord(rec, predicate) {
|
|
return Object.entries(rec).reduce((acc, [key, val]) => {
|
|
acc[predicate(key, val) ? 0 : 1][key] = val;
|
|
return acc;
|
|
}, [{}, {}]);
|
|
}
|
|
exports.partitionRecord = partitionRecord;
|
|
function mapObject(input, transform) {
|
|
const result = {};
|
|
for (const [k, v] of Object.entries(input)) {
|
|
result[k] = transform(v);
|
|
}
|
|
return result;
|
|
}
|
|
exports.mapObject = mapObject;
|
|
const nullsafeVisitor = (func, ...rest) => (first) => {
|
|
if (first === null) {
|
|
return null;
|
|
}
|
|
return func(first, ...rest);
|
|
};
|
|
exports.nullsafeVisitor = nullsafeVisitor;
|