93 lines
3 KiB
JavaScript
93 lines
3 KiB
JavaScript
|
export function map(arg0, arg1, arg2) {
|
||
|
let target;
|
||
|
let filter;
|
||
|
let instructions;
|
||
|
if (typeof arg1 === "undefined" && typeof arg2 === "undefined") {
|
||
|
target = {};
|
||
|
instructions = arg0;
|
||
|
}
|
||
|
else {
|
||
|
target = arg0;
|
||
|
if (typeof arg1 === "function") {
|
||
|
filter = arg1;
|
||
|
instructions = arg2;
|
||
|
return mapWithFilter(target, filter, instructions);
|
||
|
}
|
||
|
else {
|
||
|
instructions = arg1;
|
||
|
}
|
||
|
}
|
||
|
for (const key of Object.keys(instructions)) {
|
||
|
if (!Array.isArray(instructions[key])) {
|
||
|
target[key] = instructions[key];
|
||
|
continue;
|
||
|
}
|
||
|
applyInstruction(target, null, instructions, key);
|
||
|
}
|
||
|
return target;
|
||
|
}
|
||
|
export const convertMap = (target) => {
|
||
|
const output = {};
|
||
|
for (const [k, v] of Object.entries(target || {})) {
|
||
|
output[k] = [, v];
|
||
|
}
|
||
|
return output;
|
||
|
};
|
||
|
export const take = (source, instructions) => {
|
||
|
const out = {};
|
||
|
for (const key in instructions) {
|
||
|
applyInstruction(out, source, instructions, key);
|
||
|
}
|
||
|
return out;
|
||
|
};
|
||
|
const mapWithFilter = (target, filter, instructions) => {
|
||
|
return map(target, Object.entries(instructions).reduce((_instructions, [key, value]) => {
|
||
|
if (Array.isArray(value)) {
|
||
|
_instructions[key] = value;
|
||
|
}
|
||
|
else {
|
||
|
if (typeof value === "function") {
|
||
|
_instructions[key] = [filter, value()];
|
||
|
}
|
||
|
else {
|
||
|
_instructions[key] = [filter, value];
|
||
|
}
|
||
|
}
|
||
|
return _instructions;
|
||
|
}, {}));
|
||
|
};
|
||
|
const applyInstruction = (target, source, instructions, targetKey) => {
|
||
|
if (source !== null) {
|
||
|
let instruction = instructions[targetKey];
|
||
|
if (typeof instruction === "function") {
|
||
|
instruction = [, instruction];
|
||
|
}
|
||
|
const [filter = nonNullish, valueFn = pass, sourceKey = targetKey] = instruction;
|
||
|
if ((typeof filter === "function" && filter(source[sourceKey])) || (typeof filter !== "function" && !!filter)) {
|
||
|
target[targetKey] = valueFn(source[sourceKey]);
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
let [filter, value] = instructions[targetKey];
|
||
|
if (typeof value === "function") {
|
||
|
let _value;
|
||
|
const defaultFilterPassed = filter === undefined && (_value = value()) != null;
|
||
|
const customFilterPassed = (typeof filter === "function" && !!filter(void 0)) || (typeof filter !== "function" && !!filter);
|
||
|
if (defaultFilterPassed) {
|
||
|
target[targetKey] = _value;
|
||
|
}
|
||
|
else if (customFilterPassed) {
|
||
|
target[targetKey] = value();
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
const defaultFilterPassed = filter === undefined && value != null;
|
||
|
const customFilterPassed = (typeof filter === "function" && !!filter(value)) || (typeof filter !== "function" && !!filter);
|
||
|
if (defaultFilterPassed || customFilterPassed) {
|
||
|
target[targetKey] = value;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
const nonNullish = (_) => _ != null;
|
||
|
const pass = (_) => _;
|