UNPKG

@onrails/result

Version:

Tagged Result / ResultAsync for railway-oriented TypeScript — pure tagged unions, neverthrow-shaped compat shim, FL-friendly

83 lines (80 loc) 2.29 kB
// src/internal/dual.ts var dual = (arity, body) => { const run = body; const dispatcher = (...args) => args.length >= arity ? run(...args) : (self) => run(self, ...args); return dispatcher; }; // src/result.ts var ok = (value) => ({ _tag: "Ok", value }); var err = (error) => ({ _tag: "Err", error }); var isOk = (result) => result._tag === "Ok"; var isErr = (result) => result._tag === "Err"; var map = dual( 2, (result, fn) => isOk(result) ? ok(fn(result.value)) : err(result.error) ); var mapErr = dual( 2, (result, fn) => isErr(result) ? err(fn(result.error)) : ok(result.value) ); var bimap = dual( 3, (result, onOk, onErr) => isOk(result) ? ok(onOk(result.value)) : err(onErr(result.error)) ); var flatMap = dual( 2, (result, fn) => isOk(result) ? fn(result.value) : err(result.error) ); var recover = dual( 2, (result, fn) => isErr(result) ? fn(result.error) : ok(result.value) ); var tap = dual(2, (result, fn) => { if (isOk(result)) fn(result.value); return result; }); var tapErr = dual(2, (result, fn) => { if (isErr(result)) fn(result.error); return result; }); var match = dual( 3, (result, onOk, onErr) => isOk(result) ? onOk(result.value) : onErr(result.error) ); var unwrapOr = dual( 2, (result, defaultValue) => isOk(result) ? result.value : defaultValue ); var printPayload = (payload) => { try { return JSON.stringify(payload) ?? String(payload); } catch { return String(payload); } }; var show = (result) => isOk(result) ? `Ok(${printPayload(result.value)})` : `Err(${printPayload(result.error)})`; // src/fluent.ts var fluent = (result) => ({ result, map: (fn) => fluent(map(result, fn)), mapErr: (fn) => fluent(mapErr(result, fn)), bimap: (onOk, onErr) => fluent(bimap(result, onOk, onErr)), flatMap: (fn) => fluent(flatMap(result, fn)), andThen: (fn) => fluent(flatMap(result, fn)), recover: (fn) => fluent(recover(result, fn)), tap: (fn) => fluent(tap(result, fn)), tapErr: (fn) => fluent(tapErr(result, fn)), match: (onOk, onErr) => match(result, onOk, onErr), unwrapOr: (defaultValue) => unwrapOr(result, defaultValue), toResult: () => result, toString: () => show(result) }); export { fluent }; //# sourceMappingURL=fluent.js.map //# sourceMappingURL=fluent.js.map