add Fault monad

This commit is contained in:
Emile Clark-Boman 2025-12-14 11:59:29 +10:00
parent a547a9bcaf
commit b9f2acf7e7
3 changed files with 25 additions and 3 deletions

View file

@ -1,12 +1,17 @@
{systems, ...}: let
mergeAttrsList = std.attrs.mergeAttrsList;
std = import ./std {};
parse = import ./parse {
stdSubMods = {
attrs = std.attrs;
fault = std.fault;
lists = std.lists;
result = std.result;
};
parse = import ./parse (mergeAttrsList [stdSubMods]);
in
std.attrs.mergeAttrsList [
mergeAttrsList [
# submodule content is accessible first by submodule name
# then by the name of the content (ie self.submodule.myFunc)
{inherit parse;}

View file

@ -1,5 +1,6 @@
{...}: let
attrs = import ./attrs.nix {inherit lists;};
fault = import ./fault.nix {};
lists = import ./lists.nix {};
result = import ./result.nix {inherit lists;};
in
@ -8,5 +9,5 @@ in
# submodule content is accessible first by submodule name
# then by the name of the content (ie self.submodule.myFunc)
{inherit attrs lists result;}
{inherit attrs fault lists result;}
]

16
nib/std/fault.nix Normal file
View file

@ -0,0 +1,16 @@
{...}: rec {
# Fault Monad
# Wrapper around an error (ie builtins.abort)
Fault = error: {
error = error;
};
# Pattern Matching
isFault = F: builtins.attrNames F == ["error"];
# Unwrap (Monadic Return Operation)
unwrap = F: F.error;
# Map (Monadic Bind Operation)
map = f: F: Fault (f (unwrap F));
}