/** * Take a function and the first(s) parameter(s) to inject. * Return a function that don't need those parameters. * * Example: * ``` * function myFunc(a, b, c) { * // ... * } * * const injected = inject(myFunc, "A", "B"); * injected("C"); // same result as myFunc("A", "B", "C") * ``` */ export function inject( subject: (p1: P1, ...params: OtherParams) => Result, p1: P1, ): (...params: OtherParams) => Result; export function inject( subject: (p1: P1, p2: P2, ...params: OtherParams) => Result, p1: P1, p2: P2, ): (...params: OtherParams) => Result; export function inject( subject: (p1: P1, p2: P2, p3: P3, ...params: OtherParams) => Result, p1: P1, p2: P2, p3: P3, ): (...params: OtherParams) => Result; export function inject( subject: (p1: P1, p2: P2, p3: P3, p4: P4, ...params: OtherParams) => Result, p1: P1, p2: P2, p3: P3, p4: P4, ): (...params: OtherParams) => Result; export function inject( subject: (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, ...params: OtherParams) => Result, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, ): (...params: OtherParams) => Result; export function inject( subject: (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, ...params: OtherParams) => Result, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, ): (...params: OtherParams) => Result; export function inject( subject: (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, ...params: OtherParams) => Result, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, ): (...params: OtherParams) => Result; export function inject( subject: (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, ...params: OtherParams) => Result, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, ): (...params: OtherParams) => Result; export function inject( subject: (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, ...params: OtherParams) => Result, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, ): (...params: OtherParams) => Result; export function inject( subject: (first: FirstParam, ...params: OtherParams) => Result, ...paramsToInject: any[] ) { return paramsToInject.reduce((functionToInjext, paramToInject) => { return (...params: OtherParams) => functionToInjext(paramToInject, ...params); }, subject) as (...param: OtherParams) => Result; }