@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
JavaScript
// 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