export interface Ok { ok: true; data: T; } export const Ok = (data: T): Ok => ({ ok: true, data, }); export interface Err { ok: false; error: E; } export const Err = (error: E): Err => ({ ok: false, error, }); export type Result = Ok | Err; export async function attempt( promise: Promise, ): Promise> { try { const result = await promise; return Ok(result); } catch (error) { return Err(error as E); } }