From 908c7009c730be48490e6333df264b87d999d70a Mon Sep 17 00:00:00 2001 From: tkqubo Date: Mon, 12 Oct 2015 11:15:48 +0900 Subject: [PATCH 1/4] Update _.partial --- lodash/lodash-tests.ts | 2 +- lodash/lodash.d.ts | 87 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/lodash/lodash-tests.ts b/lodash/lodash-tests.ts index c083edd4cf..f3c9f8964c 100644 --- a/lodash/lodash-tests.ts +++ b/lodash/lodash-tests.ts @@ -2474,7 +2474,7 @@ var returnedOnce = _.throttle(function (a: any) { return a * 5; }, 5); returnedOnce(4); var greetPartial = function (greeting: string, name: string) { return greeting + ' ' + name; }; -var hi = _.partial(greetPartial, 'hi'); +var hi = _.partial(greetPartial, 'hi'); hi('moe'); var defaultsDeep = _.partialRight(_.merge, _.defaults); diff --git a/lodash/lodash.d.ts b/lodash/lodash.d.ts index 8811243289..1197504042 100644 --- a/lodash/lodash.d.ts +++ b/lodash/lodash.d.ts @@ -6543,9 +6543,52 @@ declare module _ { * @param args Arguments to be partially applied. * @return The new partially applied function. **/ - partial( - func: Function, - ...args: any[]): Function; + partial: Partial; + } + + type PH = LoDashStatic; + type Function0 = () => R; + type Function1 = (t1: T1) => R; + type Function2 = (t1: T1, t2: T2) => R; + type Function3 = (t1: T1, t2: T2, t3: T3) => R; + type Function4 = (t1: T1, t2: T2, t3: T3, t4: T4) => R; + + interface Partial { + (func: Function0): Function0; + // arity 1 + (func: Function1): Function1; + (func: Function1, arg1: T1): Function0; + // arity 2 + (func: Function2): Function2; + (func: Function2, arg1: T1): Function1< T2, R>; + (func: Function2, plc1: PH, arg2: T2): Function1; + (func: Function2, arg1: T1, arg2: T2): Function0< R>; + // arity 3 + (func: Function3): Function3; + (func: Function3, arg1: T1): Function2< T2, T3, R>; + (func: Function3, plc1: PH, arg2: T2): Function2; + (func: Function3, arg1: T1, arg2: T2): Function1< T3, R>; + (func: Function3, plc1: PH, plc2: PH, arg3: T3): Function2; + (func: Function3, arg1: T1, plc2: PH, arg3: T3): Function1< T2, R>; + (func: Function3, plc1: PH, arg2: T2, arg3: T3): Function1; + (func: Function3, arg1: T1, arg2: T2, arg3: T3): Function0< R>; + // arity 4 + (func: Function4): Function4; + (func: Function4, arg1: T1): Function3< T2, T3, T4, R>; + (func: Function4, plc1: PH, arg2: T2): Function3; + (func: Function4, arg1: T1, arg2: T2): Function2< T3, T4, R>; + (func: Function4, plc1: PH, plc2: PH, arg3: T3): Function3; + (func: Function4, arg1: T1, plc2: PH, arg3: T3): Function2< T2, T4, R>; + (func: Function4, plc1: PH, arg2: T2, arg3: T3): Function2; + (func: Function4, arg1: T1, arg2: T2, arg3: T3): Function1< T4, R>; + (func: Function4, plc1: PH, plc2: PH, plc3: PH, arg4: T4): Function3; + (func: Function4, arg1: T1, plc2: PH, plc3: PH, arg4: T4): Function2< T2, T3, R>; + (func: Function4, plc1: PH, arg2: T2, plc3: PH, arg4: T4): Function2; + (func: Function4, arg1: T1, arg2: T2, plc3: PH, arg4: T4): Function1< T3, R>; + (func: Function4, plc1: PH, plc2: PH, arg3: T3, arg4: T4): Function2; + (func: Function4, arg1: T1, plc2: PH, arg3: T3, arg4: T4): Function1< T2, R>; + (func: Function4, plc1: PH, arg2: T2, arg3: T3, arg4: T4): Function1; + (func: Function4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): Function0< R>; } //_.partialRight @@ -6562,6 +6605,44 @@ declare module _ { ...args: any[]): Function; } + interface PartialRight { + (func: Function0): Function0; + // arity 1 + (func: Function1): Function1; + (func: Function1, arg1: T1): Function0; + // arity 2 + (func: Function2): Function2; + (func: Function2, arg1: T1, plc2: PH): Function1< T2, R>; + (func: Function2, arg2: T2): Function1; + (func: Function2, arg1: T1, arg2: T2): Function0< R>; + // arity 3 + (func: Function3): Function3; + (func: Function3, arg1: T1, plc2: PH, plc3: PH): Function2< T2, T3, R>; + (func: Function3, plc1: PH, arg2: T2, plc3: PH): Function2; + (func: Function3, arg1: T1, arg2: T2, plc3: PH): Function1< T3, R>; + (func: Function3, arg3: T3): Function2; + (func: Function3, arg1: T1, plc2: PH, arg3: T3): Function1< T2, R>; + (func: Function3, arg2: T2, arg3: T3): Function1; + (func: Function3, arg1: T1, arg2: T2, arg3: T3): Function0< R>; + // arity 4 + (func: Function4): Function4; + (func: Function4, arg1: T1, plc2: PH, plc3: PH, plc4: PH): Function3< T2, T3, T4, R>; + (func: Function4, arg1: PH, arg2: T2, plc3: PH, plc4: PH): Function3; + (func: Function4, arg1: T1, arg2: T2, plc3: PH, plc4: PH): Function2< T3, T4, R>; + (func: Function4, plc1: PH, plc2: PH, arg3: T3, plc4: PH): Function3; + (func: Function4, arg1: T1, plc2: PH, arg3: T3, plc4: PH): Function2< T2, T4, R>; + (func: Function4, arg2: T2, arg3: T3, plc4: PH): Function2; + (func: Function4, arg1: T1, arg2: T2, arg3: T3, plc4: PH): Function1< T4, R>; + (func: Function4, arg4: T4): Function3; + (func: Function4, arg1: T1, plc2: PH, plc3: PH, arg4: T4): Function2< T2, T3, R>; + (func: Function4, plc1: PH, arg2: T2, plc3: PH, arg4: T4): Function2; + (func: Function4, arg1: T1, arg2: T2, plc3: PH, arg4: T4): Function1< T3, R>; + (func: Function4, plc1: PH, plc2: PH, arg3: T3, arg4: T4): Function2; + (func: Function4, arg1: T1, plc2: PH, arg3: T3, arg4: T4): Function1< T2, R>; + (func: Function4, arg2: T2, arg3: T3, arg4: T4): Function1; + (func: Function4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): Function0< R>; + } + //_.rearg interface LoDashStatic { /** From 072851d2253b363e80ea72e8b0dec9ee945fe547 Mon Sep 17 00:00:00 2001 From: tkqubo Date: Mon, 12 Oct 2015 21:08:24 +0900 Subject: [PATCH 2/4] Replace method --- lodash/lodash.d.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lodash/lodash.d.ts b/lodash/lodash.d.ts index 1197504042..f8432899fc 100644 --- a/lodash/lodash.d.ts +++ b/lodash/lodash.d.ts @@ -6600,9 +6600,7 @@ declare module _ { * @param args Arguments to be partially applied. * @return The new partially applied function. **/ - partialRight( - func: Function, - ...args: any[]): Function; + partialRight: PartialRight } interface PartialRight { From 28eaae8ef16a9cd539124e72bbfc16cc1be6b05b Mon Sep 17 00:00:00 2001 From: tkqubo Date: Thu, 15 Oct 2015 21:36:53 +0900 Subject: [PATCH 3/4] test: write some tests and fix bugs --- lodash/lodash-tests.ts | 116 +++++++++++++++++++++++++++++++++++++++++ lodash/lodash.d.ts | 12 +++-- 2 files changed, 123 insertions(+), 5 deletions(-) diff --git a/lodash/lodash-tests.ts b/lodash/lodash-tests.ts index f3c9f8964c..d69516dcb7 100644 --- a/lodash/lodash-tests.ts +++ b/lodash/lodash-tests.ts @@ -2477,6 +2477,7 @@ var greetPartial = function (greeting: string, name: string) { return greeting + var hi = _.partial(greetPartial, 'hi'); hi('moe'); + var defaultsDeep = _.partialRight(_.merge, _.defaults); var optionsPartialRight = { @@ -3866,3 +3867,118 @@ result = <_.TemplateSettings>_.templateSettings; result = _(42).times(testTimesFn).value(); result = _(42).times(testTimesFn, any).value(); } + +// _.partial & _.partialRight +{ + function func0(): number { + return 42; + } + function func1(arg1: number): number { + return arg1 * 2; + } + function func2(arg1: number, arg2: string): number { + return arg1 * arg2.length; + } + function func3(arg1: number, arg2: string, arg3: boolean): number { + return arg1 * arg2.length + (arg3 ? 1 : 0); + } + function func4(arg1: number, arg2: string, arg3: boolean, arg4: number): number { + return arg1 * arg2.length + (arg3 ? 1 : 0) - arg4; + } + let res____: () => number; + let res1___: (arg1: number ) => number; + let res_2__: ( arg2: string ) => number; + let res__3_: ( arg3: boolean ) => number; + let res___4: ( arg4: number) => number; + let res12__: (arg1: number, arg2: string ) => number; + let res1_3_: (arg1: number, arg3: boolean ) => number; + let res1__4: (arg1: number, arg4: number) => number; + let res_23_: ( arg2: string, arg3: boolean ) => number; + let res_2_4: ( arg2: string, arg4: number) => number; + let res__34: ( arg3: boolean, arg4: number) => number; + let res123_: (arg1: number, arg2: string, arg3: boolean ) => number; + let res12_4: (arg1: number, arg2: string, arg4: number) => number; + let res1_34: (arg1: number, arg3: boolean, arg4: number) => number; + let res_234: ( arg2: string, arg3: boolean, arg4: number) => number; + let res1234: (arg1: number, arg2: string, arg3: boolean, arg4: number) => number; + + // + // _.partial + // + // with arity 0 function + res____ = _.partial(func0); + // with arity 1 function + res____ = _.partial(func1, 42 ); + res1___ = _.partial(func1 ); + // with arity 2 function + res12__ = _.partial(func2 ); + res_2__ = _.partial(func2, 42 ); + res1___ = _.partial(func2, _, "foo"); + res____ = _.partial(func2, 42, "foo"); + // with arity 3 function + res123_ = _.partial(func3 ); + res_23_ = _.partial(func3, 42 ); + res1_3_ = _.partial(func3, _, "foo" ); + res__3_ = _.partial(func3, 42, "foo" ); + res12__ = _.partial(func3, _, _, true); + res_2__ = _.partial(func3, 42, _, true); + res1___ = _.partial(func3, _, "foo", true); + res____ = _.partial(func3, 42, "foo", true); + // with arity 4 function + res1234 = _.partial(func4 ); + res_234 = _.partial(func4, 42 ); + res1_34 = _.partial(func4, _, "foo" ); + res__34 = _.partial(func4, 42, "foo" ); + res12_4 = _.partial(func4, _, _, true ); + res_2_4 = _.partial(func4, 42, _, true ); + res1__4 = _.partial(func4, _, "foo", true ); + res___4 = _.partial(func4, 42, "foo", true ); + res123_ = _.partial(func4, _, _, _, 100); + res_23_ = _.partial(func4, 42, _, _, 100); + res1_3_ = _.partial(func4, _, "foo", _, 100); + res__3_ = _.partial(func4, 42, "foo", _, 100); + res12__ = _.partial(func4, _, _, true, 100); + res_2__ = _.partial(func4, 42, _, true, 100); + res1___ = _.partial(func4, _, "foo", true, 100); + res____ = _.partial(func4, 42, "foo", true, 100); + + // + // _.partialRight + // + // with arity 0 function + res____ = _.partialRight(func0); + // with arity 1 function + res____ = _.partialRight(func1, 42 ); + res1___ = _.partialRight(func1 ); + // with arity 2 function + res12__ = _.partialRight(func2 ); + res_2__ = _.partialRight(func2, 42, _); + res1___ = _.partialRight(func2, "foo"); + res____ = _.partialRight(func2, 42, "foo"); + // with arity 3 function + res123_ = _.partialRight(func3 ); + res_23_ = _.partialRight(func3, 42, _, _); + res1_3_ = _.partialRight(func3, "foo", _); + res__3_ = _.partialRight(func3, 42, "foo", _); + res12__ = _.partialRight(func3, true); + res_2__ = _.partialRight(func3, 42, _, true); + res1___ = _.partialRight(func3, "foo", true); + res____ = _.partialRight(func3, 42, "foo", true); + // with arity 4 function + res1234 = _.partialRight(func4 ); + res_234 = _.partialRight(func4, 42, _, _, _); + res1_34 = _.partialRight(func4, "foo", _, _); + res__34 = _.partialRight(func4, 42, "foo", _, _); + res12_4 = _.partialRight(func4, true, _); + res_2_4 = _.partialRight(func4, 42, _, true, _); + res1__4 = _.partialRight(func4, "foo", true, _); + res___4 = _.partialRight(func4, 42, "foo", true, _); + res123_ = _.partialRight(func4, 100); + res_23_ = _.partialRight(func4, 42, _, _, 100); + res1_3_ = _.partialRight(func4, "foo", _, 100); + res__3_ = _.partialRight(func4, 42, "foo", _, 100); + res12__ = _.partialRight(func4, true, 100); + res_2__ = _.partialRight(func4, 42, _, true, 100); + res1___ = _.partialRight(func4, "foo", true, 100); + res____ = _.partialRight(func4, 42, "foo", true, 100); +} diff --git a/lodash/lodash.d.ts b/lodash/lodash.d.ts index f8432899fc..fd1bf44a86 100644 --- a/lodash/lodash.d.ts +++ b/lodash/lodash.d.ts @@ -6554,6 +6554,7 @@ declare module _ { type Function4 = (t1: T1, t2: T2, t3: T3, t4: T4) => R; interface Partial { + // arity 0 (func: Function0): Function0; // arity 1 (func: Function1): Function1; @@ -6604,6 +6605,7 @@ declare module _ { } interface PartialRight { + // arity 0 (func: Function0): Function0; // arity 1 (func: Function1): Function1; @@ -6616,7 +6618,7 @@ declare module _ { // arity 3 (func: Function3): Function3; (func: Function3, arg1: T1, plc2: PH, plc3: PH): Function2< T2, T3, R>; - (func: Function3, plc1: PH, arg2: T2, plc3: PH): Function2; + (func: Function3, arg2: T2, plc3: PH): Function2; (func: Function3, arg1: T1, arg2: T2, plc3: PH): Function1< T3, R>; (func: Function3, arg3: T3): Function2; (func: Function3, arg1: T1, plc2: PH, arg3: T3): Function1< T2, R>; @@ -6625,17 +6627,17 @@ declare module _ { // arity 4 (func: Function4): Function4; (func: Function4, arg1: T1, plc2: PH, plc3: PH, plc4: PH): Function3< T2, T3, T4, R>; - (func: Function4, arg1: PH, arg2: T2, plc3: PH, plc4: PH): Function3; + (func: Function4, arg2: T2, plc3: PH, plc4: PH): Function3; (func: Function4, arg1: T1, arg2: T2, plc3: PH, plc4: PH): Function2< T3, T4, R>; - (func: Function4, plc1: PH, plc2: PH, arg3: T3, plc4: PH): Function3; + (func: Function4, arg3: T3, plc4: PH): Function3; (func: Function4, arg1: T1, plc2: PH, arg3: T3, plc4: PH): Function2< T2, T4, R>; (func: Function4, arg2: T2, arg3: T3, plc4: PH): Function2; (func: Function4, arg1: T1, arg2: T2, arg3: T3, plc4: PH): Function1< T4, R>; (func: Function4, arg4: T4): Function3; (func: Function4, arg1: T1, plc2: PH, plc3: PH, arg4: T4): Function2< T2, T3, R>; - (func: Function4, plc1: PH, arg2: T2, plc3: PH, arg4: T4): Function2; + (func: Function4, arg2: T2, plc3: PH, arg4: T4): Function2; (func: Function4, arg1: T1, arg2: T2, plc3: PH, arg4: T4): Function1< T3, R>; - (func: Function4, plc1: PH, plc2: PH, arg3: T3, arg4: T4): Function2; + (func: Function4, arg3: T3, arg4: T4): Function2; (func: Function4, arg1: T1, plc2: PH, arg3: T3, arg4: T4): Function1< T2, R>; (func: Function4, arg2: T2, arg3: T3, arg4: T4): Function1; (func: Function4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): Function0< R>; From 600a90d8cde60c4267ea6f99d4945393c81ffafa Mon Sep 17 00:00:00 2001 From: tkqubo Date: Thu, 15 Oct 2015 21:39:00 +0900 Subject: [PATCH 4/4] feat: add catch-alls --- lodash/lodash.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lodash/lodash.d.ts b/lodash/lodash.d.ts index fd1bf44a86..eaedd9764f 100644 --- a/lodash/lodash.d.ts +++ b/lodash/lodash.d.ts @@ -6590,6 +6590,8 @@ declare module _ { (func: Function4, arg1: T1, plc2: PH, arg3: T3, arg4: T4): Function1< T2, R>; (func: Function4, plc1: PH, arg2: T2, arg3: T3, arg4: T4): Function1; (func: Function4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): Function0< R>; + // catch-all + (func: Function, ...args: any[]): Function; } //_.partialRight @@ -6641,6 +6643,8 @@ declare module _ { (func: Function4, arg1: T1, plc2: PH, arg3: T3, arg4: T4): Function1< T2, R>; (func: Function4, arg2: T2, arg3: T3, arg4: T4): Function1; (func: Function4, arg1: T1, arg2: T2, arg3: T3, arg4: T4): Function0< R>; + // catch-all + (func: Function, ...args: any[]): Function; } //_.rearg