Skip to content

Commit

Permalink
perf: an early esapes to tests when merging unknown types
Browse files Browse the repository at this point in the history
  • Loading branch information
RebeccaStevens committed Sep 17, 2021
1 parent ef76362 commit 17a92e1
Showing 1 changed file with 28 additions and 16 deletions.
44 changes: 28 additions & 16 deletions src/deepmerge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,43 +117,55 @@ function mergeUnknowns<
U extends DeepMergeMergeFunctionUtils,
MF extends DeepMergeMergeFunctionsURIs
>(values: Ts, utils: U): DeepMergeHKT<Ts, MF> {
const types = values.map(getObjectType);
const type = types[0];
const type = getObjectType(values[0]);

if (types.every((value) => value === type)) {
if (type === ObjectType.RECORD) {
// eslint-disable-next-line functional/no-conditional-statement -- add an early escape for better performance.
if (type !== ObjectType.NOT && type !== ObjectType.OTHER) {
// eslint-disable-next-line functional/no-loop-statement, functional/no-let -- using a loop here is more performant than mapping every value and then testing every value.
for (let i = 1; i < values.length; i++) {
// eslint-disable-next-line functional/no-conditional-statement -- waiting on https://github.com/jonaskello/eslint-plugin-functional/issues/269
if (getObjectType(values[i]) === type) {
continue;
}

return utils.mergeFunctions.mergeOthers(values, utils) as DeepMergeHKT<
Ts,
MF
>;
}
}

switch (type) {
case ObjectType.RECORD:
return utils.mergeFunctions.mergeRecords(
values as ReadonlyArray<Readonly<Record<RecordProperty, unknown>>>,
utils
) as DeepMergeHKT<Ts, MF>;
}

if (type === ObjectType.ARRAY) {
case ObjectType.ARRAY:
return utils.mergeFunctions.mergeArrays(
values as ReadonlyArray<ReadonlyArray<unknown>>,
utils
) as DeepMergeHKT<Ts, MF>;
}

if (type === ObjectType.SET) {
case ObjectType.SET:
return utils.mergeFunctions.mergeSets(
values as ReadonlyArray<Readonly<ReadonlySet<unknown>>>,
utils
) as DeepMergeHKT<Ts, MF>;
}

if (type === ObjectType.MAP) {
case ObjectType.MAP:
return utils.mergeFunctions.mergeMaps(
values as ReadonlyArray<Readonly<ReadonlyMap<unknown, unknown>>>,
utils
) as DeepMergeHKT<Ts, MF>;
}
}

return utils.mergeFunctions.mergeOthers(values, utils) as DeepMergeHKT<
Ts,
MF
>;
default:
return utils.mergeFunctions.mergeOthers(values, utils) as DeepMergeHKT<
Ts,
MF
>;
}
}

/**
Expand Down

0 comments on commit 17a92e1

Please sign in to comment.