|
@@ -1,15 +1,38 @@
|
|
|
-function copyWith (obj, key, value) {
|
|
|
- const result = typeof key === 'number' ? obj == null ? [] : [...obj] : obj == null ? {} : {...obj};
|
|
|
+function copyArrayWith (obj, key, value) {
|
|
|
+ const result = obj == null ? [] : [...obj];
|
|
|
result[key] = value;
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+function copyMapWith (obj, key, value) {
|
|
|
+ const result = obj == null ? new Map() : new Map(obj);
|
|
|
+ result.set(key, value);
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+function copyObjectWith (obj, key, value) {
|
|
|
+ const result = obj == null ? {} : {...obj};
|
|
|
+ result[key] = value;
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+const isMapKey = key => typeof key === 'object' && key.isKeyInMap === true;
|
|
|
+
|
|
|
+export const keyInMap = key => ({isKeyInMap: true, key});
|
|
|
+
|
|
|
+export const kim = keyInMap;
|
|
|
+
|
|
|
+const copyWith = (obj, key, value) =>
|
|
|
+ typeof key === 'number' ? copyArrayWith(obj, key, value) :
|
|
|
+ isMapKey(key) ? copyMapWith(obj, key.key, value) :
|
|
|
+ copyObjectWith(obj, key, value);
|
|
|
+
|
|
|
const constructKeys = function (keyDescriptions) {
|
|
|
const keys = [];
|
|
|
|
|
|
function fillKeys (keyDescriptions) {
|
|
|
keyDescriptions.forEach(each => {
|
|
|
- if (typeof each === 'number') keys.push(each);
|
|
|
+ if (typeof each === 'number' || isMapKey(each)) keys.push(each);
|
|
|
else if (Array.isArray(each)) fillKeys(each);
|
|
|
else keys.push(...each.toString().split('.'));
|
|
|
});
|
|
@@ -20,13 +43,15 @@ const constructKeys = function (keyDescriptions) {
|
|
|
return keys;
|
|
|
};
|
|
|
|
|
|
-const deepGet = (keys, obj) => keys.reduce((x, key) => x == null ? undefined : x[key], obj);
|
|
|
+const getKey = (x, key) => x == null ? undefined : isMapKey(key) ? x.get(key.key) : x[key];
|
|
|
+
|
|
|
+const deepGet = (keys, obj) => keys.reduce(getKey, obj);
|
|
|
|
|
|
const deepPut = (keys, obj, val) => {
|
|
|
function setVal (x, index) {
|
|
|
if (index >= keys.length) return val;
|
|
|
const key = keys[index],
|
|
|
- value = x == null ? undefined : x[key],
|
|
|
+ value = getKey(x, key),
|
|
|
modified = setVal(value, index + 1);
|
|
|
return value === modified ? x : copyWith(x, key, modified);
|
|
|
}
|