diff options
author | 2017-05-31 01:26:06 +0300 | |
---|---|---|
committer | 2017-05-31 01:26:06 +0300 | |
commit | 7c9330d8f788e9671f7db95cafa0cdca045f0472 (patch) | |
tree | b7cfe7dd23dfb212892a49ad8dbd48ecaf281468 /pomu/util | |
parent | Added vim swap files to .gitignore (diff) | |
download | pomu-7c9330d8f788e9671f7db95cafa0cdca045f0472.tar.gz pomu-7c9330d8f788e9671f7db95cafa0cdca045f0472.tar.bz2 pomu-7c9330d8f788e9671f7db95cafa0cdca045f0472.zip |
Refactoring
added a Result type
separated presentation from logic
moved utility code into separate modules
Diffstat (limited to 'pomu/util')
-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 |