// ── Core Types ───────────────────────────────────────────
export function ok(value) {
return { ok: true, value: value };
}
export function err(typeOrPayload, payload) {
if (payload !== undefined) {
return { ok: false, error: { type: typeOrPayload, ...payload } };
}
return { ok: false, error: typeOrPayload };
}
/**
* Helper to embed a cause error payload when constructing a new Err.
*
* @example
* const low = err('Low')
* const high = err('High', cause(low))
*/
export function cause(e) {
return { cause: e.error };
}
// ── Utility Functions (functional style) ────────────────
export const map = (r, fn) => (r.ok ? ok(fn(r.value)) : r);
export const mapErr = (r, fn) => (r.ok ? r : err(fn(r.error)));
export const flatMap = (r, fn) => (r.ok ? fn(r.value) : r);
export const unwrap = (r) => {
if (r.ok)
return r.value;
throw r.error;
};
export const orElse = (r, fallback) => (r.ok ? r.value : fallback);
// ── Universal factory / wrapper / rehydrator ────────────
const isPromiseLike = (v) => typeof v === "object" && v !== null && "then" in v;
export function result(work) {
if (isPromiseLike(work)) {
return Promise.resolve(work)
.then((ok))
.catch((e) => err(e));
}
try {
return ok(work());
}
catch (e) {
return err(e);
}
}
export function match(a, b) {
if (typeof a === "object" && a && "ok" in a) {
return a.ok ? b.ok(a.value) : b.err(a.error);
}
return b[a]();
}