1from __future__ import annotations
2
3from functools import partial
4from typing import TYPE_CHECKING, Callable, TypeVar
5
6from stdlibx.option import Option, methods
7from typing_extensions import TypeVarTuple, Unpack
8
9if TYPE_CHECKING:
10 from stdlibx.option._option import Operation
11
12T = TypeVar("T")
13U = TypeVar("U")
14Ts = TypeVarTuple("Ts")
15
16
[docs]
17def is_some_and(func: Callable[[T], bool]) -> Operation[Option[T], bool]:
18 return partial(methods.is_some_and, func=func)
19
20
[docs]
21def is_none_or(func: Callable[[T], bool]) -> Operation[Option[T], bool]:
22 return partial(methods.is_none_or, func=func)
23
24
[docs]
25def expect(msg: str) -> Operation[Option[T], T]:
26 return partial(methods.expect, msg=msg)
27
28
[docs]
29def unwrap() -> Operation[Option[T], T]:
30 return methods.unwrap
31
32
[docs]
33def unwrap_or(default: T) -> Operation[Option[T], T]:
34 return partial(methods.unwrap_or, default=default)
35
36
[docs]
37def unwrap_or_else(func: Callable[[], T]) -> Operation[Option[T], T]:
38 return partial(methods.unwrap_or_else, func=func)
39
40
[docs]
41def map_(func: Callable[[T], U]) -> Operation[Option[T], Option[U]]:
42 return partial(methods.map_, func=func)
43
44
[docs]
45def inspect(func: Callable[[T], None]) -> Operation[Option[T], Option[T]]:
46 return partial(methods.inspect, func=func)
47
48
[docs]
49def map_or(default: U, func: Callable[[T], U]) -> Operation[Option[T], U]:
50 return partial(methods.map_or, default=default, func=func)
51
52
[docs]
53def map_or_else(
54 default: Callable[[], U], func: Callable[[T], U]
55) -> Operation[Option[T], U]:
56 return partial(methods.map_or_else, default=default, func=func)
57
58
[docs]
59def and_(other: Option[U]) -> Operation[Option[T], Option[U]]:
60 return partial(methods.and_, other=other)
61
62
[docs]
63def and_then(func: Callable[[T], Option[U]]) -> Operation[Option[T], Option[U]]:
64 return partial(methods.and_then, func=func)
65
66
[docs]
67def filter_(predicate: Callable[[T], bool]) -> Operation[Option[T], Option[T]]:
68 return partial(methods.filter_, predicate=predicate)
69
70
[docs]
71def or_(default: Option[T]) -> Operation[Option[T], Option[T]]:
72 return partial(methods.or_, default=default)
73
74
[docs]
75def or_else(default: Callable[[], Option[T]]) -> Operation[Option[T], Option[T]]:
76 return partial(methods.or_else, default=default)
77
78
[docs]
79def xor(other: Option[T]) -> Operation[Option[T], Option[T]]:
80 return partial(methods.xor, other=other)
81
82
[docs]
83def flatten() -> Operation[Option[Option[T]], Option[T]]:
84 return methods.flatten
85
86
[docs]
87def zipped(
88 func: Callable[[Unpack[Ts]], Option[U]],
89) -> Operation[Option[tuple[Unpack[Ts]]], Option[tuple[Unpack[Ts], U]]]:
90 return partial(methods.zipped, func=func)