interface Result<T = unknown> {
  res: T;
}

export function memoize<T = unknown>(callback: () => T): () => T {
  let memo: null | Result<T> = null;

  return (): T => {
    if (memo) {
      return memo.res;
    }

    const res = callback();
    memo = { res };
    return res;
  };
}