diff --git a/src/curry.js b/src/curry.js new file mode 100644 index 0000000..eea2f5f --- /dev/null +++ b/src/curry.js @@ -0,0 +1,11 @@ +export default function curry(fn) { + return function curried(...args) { + if (args.length >= fn.length) { + return fn(...args); + } else { + return function recursion(...newArgs) { + return curried(...args, ...newArgs); + }; + } + }; +} diff --git a/src/test/curry.test.js b/src/test/curry.test.js new file mode 100644 index 0000000..5632e4c --- /dev/null +++ b/src/test/curry.test.js @@ -0,0 +1,38 @@ +import curry from "../curry"; + +describe("curry 테스트", () => { + const sum = (a, b, c) => a + b + c; + const join = (a, b, c) => `${a}_${b}_${c}`; + + test("모든 인자를 한 번에 넘겨 호출 했을 때", () => { + const curriedSum = curry(sum); + const curriedJoin = curry(join); + + expect(curriedSum(1, 2, 3)).toBe(6); + expect(curriedJoin(1, 2, 3)).toBe("1_2_3"); + }); + + test("인자를 하나씩 전달했을 때", () => { + const curriedSum = curry(sum); + const curriedJoin = curry(join); + + expect(curriedSum(1)(2)(3)).toBe(6); + expect(curriedJoin(1)(2)(3)).toBe("1_2_3"); + }); + + test("여러 그룹으로 인자를 나누어 호출했을 때", () => { + const curriedSum = curry(sum); + const curriedJoin = curry(join); + + expect(curriedSum(1, 2)(3)).toBe(6); + expect(curriedSum(1)(2, 3)).toBe(6); + expect(curriedJoin(1, 2)(3)).toBe("1_2_3"); + expect(curriedJoin(1)(2, 3)).toBe("1_2_3"); + }); + + test("인자가 추가적으로 있을 때", () => { + const curriedSum = curry(sum); + + expect(curriedSum(1, 2, 3, 4)).toBe(6); + }); +});