docs: def memoize(f):
      """ Decorator which caches function's return value each it is called.
      If called later with same arguments, the cached value is returned.
      """
      cache = {}
  
      @wraps(f)
      def inner(arg):
          if arg not in cache:
              cache[arg] = f(arg)
          return cache[arg]
      return inner