diff options
Diffstat (limited to 'pomu/util/result.py')
-rw-r--r-- | pomu/util/result.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/pomu/util/result.py b/pomu/util/result.py new file mode 100644 index 0000000..1d5092f --- /dev/null +++ b/pomu/util/result.py @@ -0,0 +1,60 @@ +"""Result type module""" + +class ResultException(Exception): + pass + +class Result(): + """Result = Err E | Ok V""" + + def __init__(self, is_val): + self._is_val = is_val + + @classmethod + def Ok(cls, val): + res = cls(True) + res._val = val + return res + + @classmethod + def Err(cls, val): + res = cls(False) + res._val = val + return res + + def is_ok(self): + return self._is_val + + def is_err(self): + return not self._is_val + + def ok(self): + return self._val if self._is_val else None + + def err(self): + return self._val if not self._is_val else None + + def map(self, f): + return Result.Ok(f(self.ok())) if self._is_val else Result.Err(self.err()) + + def map_err(self, f): + return Result.Err(f(self.err())) if not self._is_val else Result.Ok(self.ok()) + + def unwrap(self): + return self.expect(self.err()) + + def expect(self, msg='Error'): + if self._is_val: + return self._val + raise ResultException(msg + ': ' + self._val) + + def unwrap_err(self): + return self.expect_err(self.ok()) + + def expect_err(self, msg='Error'): + if not self._is_val: + return self._val + raise ResultException(msg + ': ' + self._val) + + def __iter__(self): + if self._is_val: + yield self._val |