nt/nib/std/result.nix

48 lines
849 B
Nix
Raw Normal View History

{lists, ...}: rec {
2025-12-13 22:00:15 +10:00
# Result Monad
Ok = value: {
success = true;
2025-12-13 22:00:15 +10:00
value = value;
};
Err = err: {
success = false;
value = err;
2025-12-13 22:00:15 +10:00
};
# Pattern Matching
isResult = r: builtins.attrNames r == ["success" "value"];
isOk = r: isResult r && r.success;
isErr = r: isResult r && !r.success;
2025-12-13 22:00:15 +10:00
# Unwrap (Monadic Return Operation)
unwrap = f: r:
if isOk r
then r.value
else f r.value;
2025-12-13 22:00:15 +10:00
unwrapDefault = default: unwrap (_: default);
2025-12-13 22:00:15 +10:00
# Map (Monadic Bind Operation)
identity = r: r;
map = r: f: g:
if isOk r
then Ok (f r.value)
else Err (g r.value);
mapOk = f: map f identity;
mapErr = f: map identity f;
# Conditionals
okOr = r: f:
if isOk r
then r
else f r;
errOr = r: f:
if isErr r
then r
else f r;
firstErr = lists.findFirst isErr (Ok "No errors");
}