Source code for stdlibx.option.methods.base

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