diff --git a/nib/types/default.nix b/nib/types/default.nix index b1d11b2..06fdace 100644 --- a/nib/types/default.nix +++ b/nib/types/default.nix @@ -2,10 +2,12 @@ fault = import ./fault.nix args; maybe = import ./maybe.nix args; res = import ./res.nix args; + terminal = import ./terminal.nix args; in nib.std.mergeAttrsList [ # submodule is included directly to this module (ie self.myFunc) fault maybe res + terminal ] diff --git a/nib/types/terminal.nix b/nib/types/terminal.nix new file mode 100644 index 0000000..a3b37a9 --- /dev/null +++ b/nib/types/terminal.nix @@ -0,0 +1,21 @@ +{nib, ...}: rec { + # Terminal Monad + # Wrapper around a value (preserves lazy eval for the value) + Terminal = value: { + _nbtype_ = "nib::Terminal"; + _value_ = value; + }; + + # Pattern Matching + isTerminal = T: + (builtins.attrNames T == ["_nbtype_" "_value_"]) + && T._nbtype_ == "nib::Terminal"; + + # Unwrap (Monadic Return Operation) + unwrapTerminal = T: + assert isTerminal T || nib.panic.badType "Terminal" T; + T._value_; + + # Map (Monadic Bind Operation) + mapTerminal = f: T: Terminal (f (unwrapTerminal T)); +}