diff --git a/nib/default.nix b/nib/default.nix index 3a6e4dc..72599c8 100644 --- a/nib/default.nix +++ b/nib/default.nix @@ -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;} diff --git a/nib/std/default.nix b/nib/std/default.nix index ad57d8c..e064449 100644 --- a/nib/std/default.nix +++ b/nib/std/default.nix @@ -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;} ] diff --git a/nib/std/fault.nix b/nib/std/fault.nix new file mode 100644 index 0000000..b5f1aa6 --- /dev/null +++ b/nib/std/fault.nix @@ -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)); +}