diff --git a/src/__tests__/curry.spec.ts b/src/__tests__/curry.spec.ts index 6a74bfe..6972e21 100644 --- a/src/__tests__/curry.spec.ts +++ b/src/__tests__/curry.spec.ts @@ -1,22 +1,32 @@ -import { curry } from "../curry"; +import {curry} from "../curry"; describe("curry", () => { it("returns a curried sum function", () => { - const sum = curry((a, b, c, d) => a + b + c + d); - expect(sum(1, 2, 3, 4)).toEqual(10); + const sum = curry((a: number) => a + 10); + expect(sum(1)).toEqual(11); + + const sum2 = curry((a: number, b: number) => a + b); + expect(sum2(1, 2)).toEqual(3); + + const sum3 = curry((a: number, b: number, c: number) => a + b + c); + expect(sum3(1, 2, 3)).toEqual(6); + + const sum4 = curry((a: number, b: number, c: number, d: number) => a + b + c + d); + expect(sum4(1, 2, 3, 4)).toEqual(10); }); it("returns a function if you miss the params", () => { const sum = curry((a: number, b: number, c: number, d: number) => a + b + c + d); - const sum1 = sum(1); const sum2 = sum1(2); const sum3 = sum2(3); - expect(sum3(4)).toEqual(10); + const sum4 = sum3(4); + + expect(sum4).toEqual(10); }); it("combines the two approaches and still returns correct values", () => { - const sum = curry((a, b, c, d) => a + b + c + d); + const sum = curry((a: number, b: number, c: number, d: number) => a + b + c + d); const sum1 = sum(1, 2); const sum2 = sum1(3); diff --git a/src/__tests__/has.spec.ts b/src/__tests__/has.spec.ts new file mode 100644 index 0000000..8fe513a --- /dev/null +++ b/src/__tests__/has.spec.ts @@ -0,0 +1,8 @@ +import {has} from "../has"; + +describe("has", () => { + it("checks if object has a property", () => { + expect(has('name', {name: 'John'})).toEqual(true); + expect(has('surname', {name: 'John', surname: undefined})).toEqual(false); + }); +}); diff --git a/src/curry.ts b/src/curry.ts index 2c72bb9..b6e301c 100644 --- a/src/curry.ts +++ b/src/curry.ts @@ -1,11 +1,70 @@ -export const curry = any>(fn: F) => { - const result = args => { +export interface CurryFunction1 { + (arg1: T1): R; +} + +export interface CurryFunction2 { + (arg1: T1): CurryFunction1; + + (arg1: T1, arg2: T2): R; +} + +export interface CurryFunction3 { + (arg1: T1): CurryFunction2; + + (arg1: T1, arg2: T2): CurryFunction1; + + (arg1: T1, arg2: T2, arg3: T3): R; +} + +export interface CurryFunction4 { + (arg1: T1): CurryFunction3; + + (arg1: T1, arg2: T2): CurryFunction2; + + (arg1: T1, arg2: T2, arg3: T3): CurryFunction1; + + (arg1: T1, arg2: T2, arg3: T3, arg4: T4): R; +} + +export interface CurryFunction5 { + (arg1: T1): CurryFunction4; + + (arg1: T1, arg2: T2): CurryFunction3; + + (arg1: T1, arg2: T2, arg3: T3): CurryFunction2; + + (arg1: T1, arg2: T2, arg3: T3, arg4: T4): CurryFunction1; + + (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5): R; +} + +export interface CurryFunction6 { + (arg1: T1): CurryFunction5; + + (arg1: T1, arg2: T2): CurryFunction4; + + (arg1: T1, arg2: T2, arg3: T3): CurryFunction3; + + (arg1: T1, arg2: T2, arg3: T3, arg4: T4): CurryFunction2; + + (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5): CurryFunction1; + + (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6): R; +} + + +export function curry(fn: (arg1: T1) => R): CurryFunction1; +export function curry(fn: (arg1: T1, arg2: T2) => R): CurryFunction2; +export function curry(fn: (arg1: T1, arg2: T2, arg3: T3) => R): CurryFunction3; +export function curry(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => R): CurryFunction4; +export function curry(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => R): CurryFunction5; +export function curry(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => R): CurryFunction6; +export function curry(fn: Function) { + return function curried(...args: any[]) { if (args.length >= fn.length) { return fn(...args); + } else { + return (...args2: any[]) => curried(...args, ...args2); } - return (...secArgs) => result([...args, ...secArgs]); }; - - return (...args) => result(args); -}; - +} diff --git a/src/has.ts b/src/has.ts index 26991be..38df7ff 100644 --- a/src/has.ts +++ b/src/has.ts @@ -1,7 +1,8 @@ -import { curry } from './curry'; +import {curry} from './curry'; type IHas = { (property: keyof T): (object: T) => boolean; (property: keyof T, object: T): boolean; } -export const has: IHas = curry((property, obj) => !!obj[property]); + +export const has: IHas = curry((property: keyof T, obj: T) => !!obj[property]); diff --git a/src/lenses/lens.ts b/src/lenses/lens.ts index cbb1525..116272d 100644 --- a/src/lenses/lens.ts +++ b/src/lenses/lens.ts @@ -1,7 +1,7 @@ import { curry } from '../curry'; import { prop } from '../prop'; import { path } from '../path'; -import { Optional, ValueOf } from '../common'; +import { ValueOf } from '../common'; import { assoc } from '../assoc'; import { assocPath } from '../assocPath'; @@ -34,4 +34,3 @@ export const over = curry((lens, fn, obj) => set(lens)(fn(view(lens)(obj)))(obj) export const lensProp = (key: string) => lens(prop(key), assoc(key)); export const lensPath = (key: string[]) => lens(path(key))(assocPath(key)); -