Skip to content

Commit 44f9e4c

Browse files
committed
Adds .alt and .fix methods, refs #274
1 parent 192888e commit 44f9e4c

File tree

6 files changed

+142
-2
lines changed

6 files changed

+142
-2
lines changed

returns/_generated/pointfree/alt.pyi

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ from typing import Callable, TypeVar, overload
22

33
from typing_extensions import Protocol
44

5-
from returns.context import RequiresContextIOResult, RequiresContextResult
5+
from returns.context import (
6+
RequiresContextFutureResult,
7+
RequiresContextIOResult,
8+
RequiresContextResult,
9+
)
610
from returns.future import FutureResult
711
from returns.io import IOResult
812
from returns.result import Result
@@ -37,6 +41,15 @@ class _Altable(Protocol[_ErrorType, _NewErrorType]):
3741
) -> RequiresContextIOResult[_EnvType, _ValueType, _NewErrorType]:
3842
...
3943

44+
@overload
45+
def __call__(
46+
self,
47+
container: RequiresContextFutureResult[
48+
_EnvType, _ValueType, _ErrorType,
49+
],
50+
) -> RequiresContextFutureResult[_EnvType, _ValueType, _NewErrorType]:
51+
...
52+
4053
@overload
4154
def __call__(
4255
self,

returns/_generated/pointfree/fix.pyi

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ from typing import Callable, TypeVar, overload
22

33
from typing_extensions import Protocol
44

5-
from returns.context import RequiresContextIOResult, RequiresContextResult
5+
from returns.context import (
6+
RequiresContextFutureResult,
7+
RequiresContextIOResult,
8+
RequiresContextResult,
9+
)
610
from returns.future import FutureResult
711
from returns.io import IOResult
812
from returns.result import Result
@@ -37,6 +41,15 @@ class _Fixable(Protocol[_ErrorType, _NewValueType]):
3741
) -> RequiresContextIOResult[_EnvType, _NewValueType, _ErrorType]:
3842
...
3943

44+
@overload
45+
def __call__(
46+
self,
47+
container: RequiresContextFutureResult[
48+
_EnvType, _ValueType, _ErrorType,
49+
],
50+
) -> RequiresContextFutureResult[_EnvType, _NewValueType, _ErrorType]:
51+
...
52+
4053
@overload
4154
def __call__(
4255
self,

returns/context/requires_context_future_result.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,68 @@ def bind(
202202
),
203203
)
204204

205+
def fix(
206+
self, function: Callable[[_ErrorType], _NewValueType],
207+
) -> 'RequiresContextFutureResult[_EnvType, _NewValueType, _ErrorType]':
208+
"""
209+
Composes failed container with a pure function.
210+
211+
.. code:: python
212+
213+
>>> import anyio
214+
>>> from returns.context import RequiresContextFutureResult
215+
>>> from returns.io import IOSuccess
216+
217+
>>> assert anyio.run(
218+
... RequiresContextFutureResult.from_value(1).fix(
219+
... lambda x: x + 1,
220+
... ),
221+
... RequiresContextFutureResult.empty,
222+
... ) == IOSuccess(1)
223+
224+
>>> assert anyio.run(
225+
... RequiresContextFutureResult.from_failure(1).fix(
226+
... lambda x: x + 1,
227+
... ),
228+
... RequiresContextFutureResult.empty,
229+
... ) == IOSuccess(2)
230+
231+
"""
232+
return RequiresContextFutureResult(
233+
lambda deps: self(deps).fix(function),
234+
)
235+
236+
def alt(
237+
self, function: Callable[[_ErrorType], _NewErrorType],
238+
) -> 'RequiresContextFutureResult[_EnvType, _ValueType, _NewErrorType]':
239+
"""
240+
Composes failed container with a pure function.
241+
242+
.. code:: python
243+
244+
>>> import anyio
245+
>>> from returns.context import RequiresContextFutureResult
246+
>>> from returns.io import IOSuccess, IOFailure
247+
248+
>>> assert anyio.run(
249+
... RequiresContextFutureResult.from_value(1).alt(
250+
... lambda x: x + 1,
251+
... ),
252+
... RequiresContextFutureResult.empty,
253+
... ) == IOSuccess(1)
254+
255+
>>> assert anyio.run(
256+
... RequiresContextFutureResult.from_failure(1).alt(
257+
... lambda x: x + 1,
258+
... ),
259+
... RequiresContextFutureResult.empty,
260+
... ) == IOFailure(2)
261+
262+
"""
263+
return RequiresContextFutureResult(
264+
lambda deps: self(deps).alt(function),
265+
)
266+
205267
def rescue(
206268
self,
207269
function: Callable[

typesafety/test_context/test_requires_context_future_result/test_requires_context_future_result.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,32 @@
4646
reveal_type(x.rescue(test)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.int, builtins.bool*]'
4747
4848
49+
- case: requires_context_future_result_fix
50+
disable_cache: true
51+
main: |
52+
from returns.context import RequiresContextFutureResult
53+
54+
x: RequiresContextFutureResult[str, int, float]
55+
56+
def test(param: float) -> bool:
57+
...
58+
59+
reveal_type(x.fix(test)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.bool*, builtins.float]'
60+
61+
62+
- case: requires_context_future_result_alt
63+
disable_cache: true
64+
main: |
65+
from returns.context import RequiresContextFutureResult
66+
67+
x: RequiresContextFutureResult[str, int, float]
68+
69+
def test(param: float) -> bool:
70+
...
71+
72+
reveal_type(x.alt(test)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.int, builtins.bool*]'
73+
74+
4975
- case: requires_context_future_result_value_or
5076
disable_cache: true
5177
main: |

typesafety/test_pointfree/test_alt.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,19 @@
113113
reveal_type(alt(test)(x)) # N: Revealed type is 'returns.context.requires_context_ioresult.RequiresContextIOResult[builtins.bool*, builtins.str*, builtins.int]'
114114
115115
116+
- case: alt_requires_context_future_result
117+
disable_cache: true
118+
main: |
119+
from returns.pointfree import alt
120+
from returns.context import RequiresContextFutureResult
121+
122+
def test(arg: float) -> int:
123+
...
124+
125+
x: RequiresContextFutureResult[bool, str, float]
126+
reveal_type(alt(test)(x)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.bool*, builtins.str*, builtins.int]'
127+
128+
116129
- case: alt_futureresult
117130
disable_cache: true
118131
main: |

typesafety/test_pointfree/test_fix.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,19 @@
115115
reveal_type(fix(test)(x)) # N: Revealed type is 'returns.context.requires_context_ioresult.RequiresContextIOResult[builtins.bool*, builtins.int, builtins.float]'
116116
117117
118+
- case: fix_requires_context_future_result
119+
disable_cache: true
120+
main: |
121+
from returns.pointfree import fix
122+
from returns.context import RequiresContextFutureResult
123+
124+
def test(arg: float) -> int:
125+
...
126+
127+
x: RequiresContextFutureResult[bool, str, float]
128+
reveal_type(fix(test)(x)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.bool*, builtins.int, builtins.float]'
129+
130+
118131
- case: fix_futureresult
119132
disable_cache: true
120133
main: |

0 commit comments

Comments
 (0)