最終更新 2 days ago

修正履歴 c17dac0d101e29a9fea200189109c0a3302041c4

merge.ts Raw
1/**
2 * from project:
3 * https://github.com/Noah2610/i3-color-theme-editor/blob/master/src/util/merge.ts
4 */
5
6import { RecursivePartial } from "./recursivePartial";
7
8type Dict = Record<string, unknown>;
9
10export function merge<O extends object>(
11 objA: RecursivePartial<O>,
12 objB: RecursivePartial<O>,
13): O {
14 const allKeys = new Set([...Object.keys(objA), ...Object.keys(objB)]);
15
16 const merged = {} as Dict;
17
18 for (const key of allKeys) {
19 const a = (objA as Dict)[key];
20 const b = (objB as Dict)[key];
21 merged[key] = aOrB(a, b);
22 }
23
24 return merged as O;
25}
26
27function aOrB(a: unknown, b: unknown): unknown {
28 const aIsObject = typeof a === "object";
29 const bIsObject = typeof b === "object";
30
31 if (a && b && aIsObject && bIsObject) {
32 return merge(a as Dict, b as Dict);
33 }
34
35 if (b && bIsObject) {
36 return b;
37 }
38
39 if (a && aIsObject) {
40 return a;
41 }
42
43 return b || a;
44}