Skip to content

Commit 13d36d5

Browse files
fix (merge funcs) optimize when both sides are same type (#129)
1 parent be7a919 commit 13d36d5

8 files changed

Lines changed: 86 additions & 0 deletions

test/mergeDeepLeft.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { expectType } from 'tsd';
2+
import { mergeDeepLeft } from '../es';
3+
4+
const foo = { foo: 'foo', inner: { a: 1 } };
5+
const bar = { bar: 'bar', inner: { b: 5 } };
6+
const foo2 = { foo: 2 };
7+
8+
expectType<{ foo: string; bar: string; inner: { a: number; b: number } }>(mergeDeepLeft(foo, bar));
9+
expectType<{ foo: string; inner: { a: number } }>(mergeDeepLeft(foo, foo2));
10+
expectType<{ foo: number; inner: { a: number } }>(mergeDeepLeft(foo2, foo));
11+
12+
type TestType = {
13+
foo: string;
14+
bar: string;
15+
inner: { a: number; b: number }
16+
};
17+
18+
const obj1 = {} as TestType;
19+
const obj2 = {} as TestType;
20+
21+
expectType<TestType>(mergeDeepLeft(obj1, obj2));
22+
expectType<TestType>(mergeDeepLeft(obj2, obj1));
23+
24+
expectType<TestType>(mergeDeepLeft(obj1, { foo: '', bar: '', inner: { a: 1, b: 2 } }));
25+
expectType<TestType>(mergeDeepLeft({ foo: '', bar: '', inner: { a: 1, b: 2 } }, obj2));

test/mergeDeepRight.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { expectType } from 'tsd';
2+
import { mergeDeepRight } from '../es';
3+
4+
const foo = { foo: 'foo', inner: { a: 1 } };
5+
const bar = { bar: 'bar', inner: { b: 5 } };
6+
const foo2 = { foo: 2 };
7+
8+
expectType<{ foo: string; bar: string; inner: { a: number; b: number } }>(mergeDeepRight(foo, bar));
9+
expectType<{ foo: string; inner: { a: number } }>(mergeDeepRight(foo2, foo));
10+
expectType<{ foo: number; inner: { a: number } }>(mergeDeepRight(foo, foo2));
11+
12+
type TestType = {
13+
foo: string;
14+
bar: string;
15+
inner: { a: number; b: number }
16+
};
17+
18+
const obj1 = {} as TestType;
19+
const obj2 = {} as TestType;
20+
21+
expectType<TestType>(mergeDeepRight(obj1, obj2));
22+
expectType<TestType>(mergeDeepRight(obj2, obj1));
23+
24+
expectType<TestType>(mergeDeepRight(obj1, { foo: '', bar: '', inner: { a: 1, b: 2 } }));
25+
expectType<TestType>(mergeDeepRight({ foo: '', bar: '', inner: { a: 1, b: 2 } }, obj2));

test/mergeLeft.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,17 @@ const foo2 = { foo: 2 };
77

88
expectType<{ foo: string; bar: string; }>(mergeLeft(foo, bar));
99
expectType<{ foo: string; }>(mergeLeft(foo, foo2));
10+
11+
type TestType = {
12+
foo: string;
13+
bar: string;
14+
};
15+
16+
const obj1 = {} as TestType;
17+
const obj2 = {} as TestType;
18+
19+
expectType<TestType>(mergeLeft(obj1, obj2));
20+
expectType<TestType>(mergeLeft(obj2, obj1));
21+
22+
expectType<TestType>(mergeLeft(obj1, { foo: '', bar: ''}));
23+
expectType<TestType>(mergeLeft({ foo: '', bar: ''}, obj2));

test/mergeRight.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,17 @@ const foo2 = { foo: 2 };
77

88
expectType<{ foo: string; bar: string; }>(mergeRight(foo, bar));
99
expectType<{ foo: number; }>(mergeRight(foo, foo2));
10+
11+
type TestType = {
12+
foo: string;
13+
bar: string;
14+
};
15+
16+
const obj1 = {} as TestType;
17+
const obj2 = {} as TestType;
18+
19+
expectType<TestType>(mergeRight(obj1, obj2));
20+
expectType<TestType>(mergeRight(obj2, obj1));
21+
22+
expectType<TestType>(mergeRight(obj1, { foo: '', bar: ''}));
23+
expectType<TestType>(mergeRight({ foo: '', bar: ''}, obj2));

types/mergeDeepLeft.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import * as _ from 'ts-toolbelt';
22

3+
export function mergeDeepLeft<U extends object>(l: U): (r: U) => U;
34
export function mergeDeepLeft<L extends object>(l: L): <R extends object>(r: R) => _.O.Assign<R, [L], 'deep'>;
5+
export function mergeDeepLeft<U extends object>(l: U, r: U): U;
46
export function mergeDeepLeft<L extends object, R extends object>(l: L, r: R): _.O.Assign<R, [L], 'deep'>;

types/mergeDeepRight.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import * as _ from 'ts-toolbelt';
22

3+
export function mergeDeepRight<U extends object>(l: U): (r: U) => U;
34
export function mergeDeepRight<L extends object>(l: L): <R extends object>(r: R) => _.O.Assign<L, [R], 'deep'>;
5+
export function mergeDeepRight<U extends object>(l: U, r: U): U;
46
export function mergeDeepRight<L extends object, R extends object>(l: L, r: R): _.O.Assign<L, [R], 'deep'>;

types/mergeLeft.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import * as _ from 'ts-toolbelt';
22

33
// Note: ramda `mergeLeft` uses `Object.assign` in code, so we need to use `O.Assign` here, and not `O.Merge`
4+
export function mergeLeft<U extends object>(l: U): (r: U) => U;
45
export function mergeLeft<L extends object>(l: L): <R extends object>(r: R) => _.O.Assign<R, [L], 'flat'>;
6+
export function mergeLeft<U extends object>(l: U, r: U): U;
57
export function mergeLeft<L extends object, R extends object>(l: L, r: R): _.O.Assign<R, [L], 'flat'>;

types/mergeRight.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import * as _ from 'ts-toolbelt';
22

33
// Note: ramda `mergeLeft` uses `Object.assign` in code, so we need to use `O.Assign` here, and not `O.Merge`
4+
export function mergeRight<U extends object>(l: U): (r: U) => U;
45
export function mergeRight<L extends object>(l: L): <R extends object>(r: R) => _.O.Assign<L, [R], 'flat'>;
6+
export function mergeRight<U extends object>(l: U, r: U): U;
57
export function mergeRight<L extends object, R extends object>(l: L, r: R): _.O.Assign<L, [R], 'flat'>;

0 commit comments

Comments
 (0)