From 2b2dd2510b97ded8e98ccac5fa583baa2b560dd9 Mon Sep 17 00:00:00 2001 From: Prajwal Kulkarni Date: Tue, 26 Mar 2024 12:07:13 +0000 Subject: [PATCH 1/3] refactor: improve type definitions for map arguments func --- .../utils/map-arguments/docs/types/index.d.ts | 2 +- .../utils/map-arguments/docs/types/test.ts | 36 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/index.d.ts b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/index.d.ts index 8a7e22b54ab3..1afd44d8b2cb 100644 --- a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/index.d.ts +++ b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/index.d.ts @@ -47,7 +47,7 @@ * var out = bar( 1, 2, 3 ); * // returns [ 2, 4, 6 ] */ -declare function mapArguments( fcn: Function, clbk: Function, thisArg?: any ): Function; +declare function mapArguments( fcn: ( ...args: Array ) => Array, clbk: ( arg: T ) => T, thisArg?: unknown ): ( ...args: Array ) => Array; // EXPORTS // diff --git a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts index 12a72a6f1b17..4c4b8b00818f 100644 --- a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts +++ b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts @@ -24,7 +24,7 @@ import mapArguments = require( './index' ); * @param v - argument * @returns result */ -function clbk( v: any ): any { +function clbk( v: T ): T { return v; } @@ -33,8 +33,8 @@ function clbk( v: any ): any { // The function returns a function... { - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], clbk ); // $ExpectType Function - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], clbk, {} ); // $ExpectType Function + mapArguments( ( x, y, z ): Array => [ x, y, z ], clbk ); // $ExpectType (...args: number[]) => number[] + mapArguments( ( x, y, z ): Array => [ x, y, z ], clbk, {} ); // $ExpectType (...args: string[]) => string[] } // The compiler throws an error if the function is provided a first argument other than a function... @@ -56,24 +56,24 @@ function clbk( v: any ): any { // The compiler throws an error if the function is provided a second argument other than a function... { - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], '5' ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], true ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], false ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], 123 ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], null ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], {} ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], [] ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], '5' ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], true ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], false ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], 123 ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], null ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], [] ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], '5', {} ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], true, {} ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], false, {} ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], 123, {} ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], null, {} ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], {}, {} ); // $ExpectError - mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], [], {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], '5', {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], true, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], false, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], 123, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], null, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], {}, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], [], {} ); // $ExpectError } // The compiler throws an error if the function is provided more than three arguments... { - mapArguments( ( x: number, y: number ): number => x + y, clbk, {}, 4 ); // $ExpectError + mapArguments( ( x, y ): number => x + y, clbk, {}, 4 ); // $ExpectError } From ce44167c9a69d6643f8837767803dcae0c273d83 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Sun, 13 Oct 2024 22:01:19 -0400 Subject: [PATCH 2/3] feat: improve type safety --- .../utils/map-arguments/docs/types/index.d.ts | 52 +++++++++++++++- .../utils/map-arguments/docs/types/test.ts | 62 ++++++++++++------- 2 files changed, 89 insertions(+), 25 deletions(-) diff --git a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/index.d.ts b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/index.d.ts index 1afd44d8b2cb..85cfda99b297 100644 --- a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/index.d.ts +++ b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/index.d.ts @@ -47,7 +47,57 @@ * var out = bar( 1, 2, 3 ); * // returns [ 2, 4, 6 ] */ -declare function mapArguments( fcn: ( ...args: Array ) => Array, clbk: ( arg: T ) => T, thisArg?: unknown ): ( ...args: Array ) => Array; +declare function mapArguments< + T extends ( ...args: Array ) => any, + C extends ( this: ThisParameterType, value: Parameters[number], index: number ) => any +>( + fcn: T, + clbk: C +): ( ...args: Parameters ) => ReturnType; + +/** +* Returns a function that applies arguments to a provided function after transforming arguments according to a callback function. +* +* ## Notes +* +* - The callback function is provided the following arguments: +* +* - **value**: argument value. +* - **index**: argument index. +* +* @param fcn - input function +* @param clbk - callback function +* @param thisArg - input function context +* @returns function wrapper +* +* @example +* function foo( a, b, c ) { +* return [ a, b, c ]; +* } +* +* function clbk( v ) { +* this.count += 1; +* return v * 2; +* } +* +* var thisArg = { 'count': 0 }; +* var bar = mapArguments( foo, clbk, thisArg ); +* +* var out = bar( 1, 2, 3 ); +* // returns [ 2, 4, 6 ] +* +* var count = thisArg.count; +* // returns 3 +*/ +declare function mapArguments< + T extends ( ...args: Array ) => any, + C extends ( this: ThisParameterType, value: Parameters[number], index: number ) => any, + ThisArg +>( + fcn: T, + clbk: C, + thisArg: ThisArg +): ( this: ThisArg, ...args: Parameters ) => ReturnType; // EXPORTS // diff --git a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts index 4c4b8b00818f..5b9b5e4c1ad4 100644 --- a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts +++ b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts @@ -18,23 +18,37 @@ import mapArguments = require( './index' ); -/** -* Callback function. -* -* @param v - argument -* @returns result -*/ +// FUNCTIONS // + function clbk( v: T ): T { return v; } +function stringify( n: number ): string { + return n.toString(); +} + +function sum( ...numbers: Array ): number { + return numbers.reduce( ( a, b ) => a + b, 0 ); +} + +function greet( this: { name: string }, greeting: string ): string { + return `${greeting}, ${this.name}!`; // eslint-disable-line no-invalid-this +} + // TESTS // // The function returns a function... { - mapArguments( ( x, y, z ): Array => [ x, y, z ], clbk ); // $ExpectType (...args: number[]) => number[] - mapArguments( ( x, y, z ): Array => [ x, y, z ], clbk, {} ); // $ExpectType (...args: string[]) => string[] + mapArguments( ( x: number, y: number, z: number ): Array => [ x, y, z ], clbk ); // $ExpectType (x: number, y: number, z: number) => number[] + mapArguments( ( x: string, y: string, z: string ): Array => [ x, y, z ], clbk, {} ); // $ExpectType (this: {}, x: string, y: string, z: string) => string[] + mapArguments( ( x: number, y: number ): number => x + y, clbk ); // $ExpectType (x: number, y: number) => number + + mapArguments( stringify, ( x: number ) => x * 2 ); // $ExpectType (n: number) => string + mapArguments( sum, ( x: number ) => x * 2 ); // $ExpectType (...args: number[]) => number + + mapArguments( greet, ( s: string ) => s.toUpperCase(), { 'name': 'World' } ); // $ExpectType (this: { name: string; }, greeting: string) => string } // The compiler throws an error if the function is provided a first argument other than a function... @@ -56,24 +70,24 @@ function clbk( v: T ): T { // The compiler throws an error if the function is provided a second argument other than a function... { - mapArguments( ( x, y, z ): Array => [ x, y, z ], '5' ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], true ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], false ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], 123 ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], null ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], [] ); // $ExpectError - - mapArguments( ( x, y, z ): Array => [ x, y, z ], '5', {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], true, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], false, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], 123, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], null, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], {}, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], [], {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], '5' ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], true ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], false ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], 123 ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], null ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], [] ); // $ExpectError + + mapArguments( ( x, y, z ): Array => [ x, y, z ], '5', {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], true, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], false, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], 123, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], null, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], {}, {} ); // $ExpectError + mapArguments( ( x, y, z ): Array => [ x, y, z ], [], {} ); // $ExpectError } // The compiler throws an error if the function is provided more than three arguments... { - mapArguments( ( x, y ): number => x + y, clbk, {}, 4 ); // $ExpectError + mapArguments( ( x, y ): number => x + y, clbk, {}, 4 ); // $ExpectError } From c931dec83700bfeefd8f19af1b9ae21e43793eb2 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Sun, 13 Oct 2024 22:05:37 -0400 Subject: [PATCH 3/3] chore: revert changes --- .../utils/map-arguments/docs/types/test.ts | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts index 5b9b5e4c1ad4..f18a5cb7599b 100644 --- a/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts +++ b/lib/node_modules/@stdlib/utils/map-arguments/docs/types/test.ts @@ -70,24 +70,24 @@ function greet( this: { name: string }, greeting: string ): string { // The compiler throws an error if the function is provided a second argument other than a function... { - mapArguments( ( x, y, z ): Array => [ x, y, z ], '5' ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], true ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], false ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], 123 ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], null ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], [] ); // $ExpectError - - mapArguments( ( x, y, z ): Array => [ x, y, z ], '5', {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], true, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], false, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], 123, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], null, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], {}, {} ); // $ExpectError - mapArguments( ( x, y, z ): Array => [ x, y, z ], [], {} ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], '5' ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], true ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], false ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], 123 ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], null ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], {} ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], [] ); // $ExpectError + + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], '5', {} ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], true, {} ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], false, {} ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], 123, {} ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], null, {} ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], {}, {} ); // $ExpectError + mapArguments( ( x: any, y: any, z: any ): Array => [ x, y, z ], [], {} ); // $ExpectError } // The compiler throws an error if the function is provided more than three arguments... { - mapArguments( ( x, y ): number => x + y, clbk, {}, 4 ); // $ExpectError + mapArguments( ( x: number, y: number ): number => x + y, clbk, {}, 4 ); // $ExpectError }