def ensure(self, *predicates): for pred in predicates: ensure(self._test_predicate(pred), lambda: self._format_error(pred), self.exception_type, stack_level=self.stack_level) return self.value
def or_else(self, func): if self: return self else: res = func() ensure(isinstance(res, Opt), lambda: 'or_else: result Opt expected', stack_level=2) return res
def map(self, func): func = to_unary(func) if self: res = func(self._value) ensure(not isinstance(res, Opt), lambda: 'map: result Opt not expected', stack_level=2) return Opt(res) else: return Opt.none()
def get_or_raise(self, exception): ensure(self, exception, error_type=OptError) return self._value
def some(value): ensure(value is not None, lambda: OptError('value expected, got None'), stack_level=2) return Opt(value)
def and_(self, other): ensure(isinstance(other, Opt), lambda: 'Opt expected', stack_level=2) return self if not self else other