const hash = (...args) => args.map(v => v.toString()).join('-')

const memo = (fn) => {
  const cache = {}
  return (...args) => {
    if(Object.keys(cache).includes(hash(args))) {
      return cache[hash(args)]
    }
    const result = fn(...args)
    cache[hash(args)] = result
    return result;
  }
}

const addFn = (a,b) => a+b

const memoizedAdd = memo(addFn)