export type Result<T, E extends Error = never> = { ok: true; value: T } | { ok: false; error: E };

export type ValueOf<R> = R extends { ok: true; value: infer T } ? T : never;
export type ErrorOf<R> = R extends { ok: false; error: infer E } ? E : never;

export function ok<T>(value: T): { ok: true; value: T } {
  return { ok: true, value };
}

export function err<E extends Error>(error: E): { ok: false; error: E } {
  return { ok: false, error };
}
