aboutsummaryrefslogtreecommitdiff
path: root/pomu/util
diff options
context:
space:
mode:
authorMykyta Holubakha <hilobakho@gmail.com>2017-05-31 01:26:06 +0300
committerMykyta Holubakha <hilobakho@gmail.com>2017-05-31 01:26:06 +0300
commit7c9330d8f788e9671f7db95cafa0cdca045f0472 (patch)
treeb7cfe7dd23dfb212892a49ad8dbd48ecaf281468 /pomu/util
parentAdded vim swap files to .gitignore (diff)
downloadpomu-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.py60
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