From 028e098b63bbf8f5ed46eedbaa38d09c28202db4 Mon Sep 17 00:00:00 2001 From: Damien Chazoule Date: Mon, 4 Oct 2021 13:40:17 +0200 Subject: [PATCH] Feat: Added Memoize Func --- Cache/Memoize.js | 29 ++++++++++++++++++++++++++ Cache/__tests__/Memoize.test.js | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 Cache/Memoize.js create mode 100644 Cache/__tests__/Memoize.test.js diff --git a/Cache/Memoize.js b/Cache/Memoize.js new file mode 100644 index 000000000..932b6187c --- /dev/null +++ b/Cache/Memoize.js @@ -0,0 +1,29 @@ +/** + * Memoize + * @param {Function} fn + * @returns + */ +export const memoize = (func) => { + // eslint-disable-next-line no-console + console.log(`Creating cache for function '${func.name}'`) + + const cache = {} + + return (...args) => { + const [arg] = args + + if (arg in cache) { + // eslint-disable-next-line no-console + console.log(`Reading cache with argument ${arg}`) + + return cache[arg] + } + + // eslint-disable-next-line no-console + console.log(`Updating cache with argument ${arg}`) + + const result = func(arg) + cache[arg] = result + return result + } +} diff --git a/Cache/__tests__/Memoize.test.js b/Cache/__tests__/Memoize.test.js new file mode 100644 index 000000000..74f3f5762 --- /dev/null +++ b/Cache/__tests__/Memoize.test.js @@ -0,0 +1,37 @@ +import { memoize } from '../Memoize' + +const fibonacci = (n) => { + if (n < 2) { + return n + } + + return fibonacci(n - 2) + fibonacci(n - 1) +} + +const factorial = (n) => { + if (n === 0) { + return 1 + } + + return n * factorial(n - 1) +} + +describe('memoize', () => { + it('expects the fibonacci function to use the cache on the second call', () => { + const memoFibonacci = memoize(fibonacci) + + expect(memoFibonacci(5)).toEqual(fibonacci(5)) + expect(memoFibonacci(5)).toEqual(5) + expect(memoFibonacci(10)).toEqual(fibonacci(10)) + expect(memoFibonacci(10)).toEqual(55) + }) + + it('expects the factorial function to use the cache on the second call', () => { + const memoFactorial = memoize(factorial) + + expect(memoFactorial(5)).toEqual(factorial(5)) + expect(memoFactorial(5)).toEqual(120) + expect(memoFactorial(10)).toEqual(factorial(10)) + expect(memoFactorial(10)).toEqual(3_628_800) + }) +})