aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pomu/util/result.py')
-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