Skip to content

Commit 727ed3c

Browse files
committed
perf improvements on fp/deep-copy.
1 parent b487c8d commit 727ed3c

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

src/lib/fp/__specs__/deep-copy.bench.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { deepCopy } from "../deep-copy.ts";
1+
import { deepCopy, deepCopy2 } from "../deep-copy.ts";
22

33
const group = "deep-copy";
44

@@ -16,6 +16,12 @@ Deno.bench("hex/fp/deep-copy", { group, baseline: true }, () => {
1616
deepCopy(obj1);
1717
});
1818

19+
Deno.bench("hex/fp/deep-copy-2", { group }, () => {
20+
const obj1 = new Dummy({ value: 5 });
21+
22+
deepCopy2(obj1);
23+
});
24+
1925
Deno.bench("structuredClone", { group }, () => {
2026
const obj1 = new Dummy({ value: 5 });
2127

src/lib/fp/deep-copy.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
1+
type Key = string | number | symbol;
2+
3+
// deno-lint-ignore no-explicit-any
4+
const deepCopy = <T extends Record<Key, any>>(
5+
instance: T,
6+
): T => {
7+
if (typeof instance !== "object") { // PERF !(instance instanceof Object)
8+
return instance;
9+
}
10+
11+
const Type = instance.constructor as { new (): T };
12+
const keys = Object.keys(instance); // PERF Object.entries(instance)
13+
// deno-lint-ignore no-explicit-any
14+
const instanceCopy: Record<Key, any> = new Type();
15+
16+
for (const key of keys) {
17+
const value = instance[key];
18+
19+
if (typeof value === "object") { // PERF value instanceof Object
20+
instanceCopy[key] = deepCopy(value);
21+
} else {
22+
instanceCopy[key] = value;
23+
}
24+
}
25+
26+
return instanceCopy;
27+
};
28+
129
// deno-lint-ignore no-explicit-any
2-
const deepCopy = <T extends Record<string | number | symbol, any>>(
30+
const deepCopy2 = <T extends Record<string | number | symbol, any>>(
331
instance: T,
432
): T => {
533
if (!(instance instanceof Object)) {
@@ -25,4 +53,4 @@ const deepCopy = <T extends Record<string | number | symbol, any>>(
2553
);
2654
};
2755

28-
export { deepCopy, deepCopy as default };
56+
export { deepCopy, deepCopy as default, deepCopy2 };

0 commit comments

Comments
 (0)