Source code for stdlibx.option.methods.base

  1from __future__ import annotations
  2
  3from typing import TYPE_CHECKING, Callable, TypeVar
  4
  5from stdlibx.option._errors import OptionExpectError, OptionUnwrapError
  6from stdlibx.option._option import is_none, is_some, nothing, some
  7from typing_extensions import TypeVarTuple, Unpack
  8
  9if TYPE_CHECKING:
 10    from stdlibx.option.types import Option
 11
 12T = TypeVar("T")
 13U = TypeVar("U")
 14Ts = TypeVarTuple("Ts")
 15
 16
[docs] 17def is_some_and(opt: Option[T], func: Callable[[T], bool]) -> bool: 18 return is_some(opt) and func(opt.value)
19 20
[docs] 21def is_none_or(opt: Option[T], func: Callable[[T], bool]) -> bool: 22 return is_none(opt) or (is_some(opt) and func(opt.value))
23 24
[docs] 25def expect(opt: Option[T], msg: str) -> T: 26 if is_some(opt): 27 return opt.value 28 raise OptionExpectError(msg)
29 30
[docs] 31def unwrap(opt: Option[T]) -> T: 32 if is_some(opt): 33 return opt.value 34 raise OptionUnwrapError
35 36
[docs] 37def unwrap_or(opt: Option[T], default: T) -> T: 38 if is_some(opt): 39 return opt.value 40 return default
41 42
[docs] 43def unwrap_or_else(opt: Option[T], func: Callable[[], T]) -> T: 44 if is_some(opt): 45 return opt.value 46 return func()
47 48
[docs] 49def map_(opt: Option[T], func: Callable[[T], U]) -> Option[U]: 50 if is_some(opt): 51 return some(func(opt.value)) 52 return nothing()
53 54
[docs] 55def inspect(opt: Option[T], func: Callable[[T], None]) -> Option[T]: 56 if is_some(opt): 57 func(opt.value) 58 return opt
59 60
[docs] 61def map_or(opt: Option[T], default: U, func: Callable[[T], U]) -> U: 62 if is_some(opt): 63 return func(opt.value) 64 return default
65 66
[docs] 67def map_or_else(opt: Option[T], default: Callable[[], U], func: Callable[[T], U]) -> U: 68 if is_some(opt): 69 return func(opt.value) 70 return default()
71 72
[docs] 73def and_(opt: Option[T], other: Option[U]) -> Option[U]: 74 if is_some(opt): 75 return other 76 return nothing()
77 78
[docs] 79def and_then(opt: Option[T], func: Callable[[T], Option[U]]) -> Option[U]: 80 if is_some(opt): 81 return func(opt.value) 82 return nothing()
83 84
[docs] 85def filter_(opt: Option[T], predicate: Callable[[T], bool]) -> Option[T]: 86 if is_some(opt) and predicate(opt.value) is True: 87 return some(opt.value) 88 return nothing()
89 90
[docs] 91def or_(opt: Option[T], default: Option[T]) -> Option[T]: 92 if is_some(opt): 93 return some(opt.value) 94 return default
95 96
[docs] 97def or_else(opt: Option[T], default: Callable[[], Option[T]]) -> Option[T]: 98 if is_some(opt): 99 return some(opt.value) 100 return default()
101 102
[docs] 103def xor(opt: Option[T], other: Option[T]) -> Option[T]: 104 if is_some(opt) and is_none(other): 105 return some(opt.value) 106 elif is_some(other) and is_none(opt): 107 return some(other.value) 108 else: 109 return nothing()
110 111
[docs] 112def flatten(opt: Option[Option[T]]) -> Option[T]: 113 if is_some(opt): 114 return opt.value 115 return nothing()
116 117
[docs] 118def zipped( 119 opt: Option[tuple[Unpack[Ts]]], func: Callable[[Unpack[Ts]], Option[U]] 120) -> Option[tuple[Unpack[Ts], U]]: 121 if is_some(opt): 122 return map_(func(*opt.value), lambda val: (*opt.value, val)) 123 return nothing()