Skip to content

Commit 153bcda

Browse files
committed
Adds .apply method, refs #274
1 parent 7baf8a6 commit 153bcda

File tree

6 files changed

+82
-6
lines changed

6 files changed

+82
-6
lines changed

returns/_generated/pointfree/apply.pyi

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ from returns.context import (
44
RequiresContext,
55
RequiresContextIOResult,
66
RequiresContextResult,
7+
RequiresContextFutureResult,
78
)
89
from returns.future import Future, FutureResult
910
from returns.io import IO, IOResult
@@ -68,6 +69,20 @@ def _apply(
6869
...
6970

7071

72+
@overload
73+
def _apply(
74+
container: RequiresContextFutureResult[
75+
_EnvType,
76+
Callable[[_ValueType], _NewValueType],
77+
_ErrorType,
78+
],
79+
) -> Callable[
80+
[RequiresContextFutureResult[_EnvType, _ValueType, _ErrorType]],
81+
RequiresContextFutureResult[_EnvType, _NewValueType, _ErrorType],
82+
]:
83+
...
84+
85+
7186
@overload
7287
def _apply(
7388
container: Result[

returns/context/requires_context_future_result.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,42 @@ def map( # noqa: WPS125
119119
lambda deps: self(deps).map(function),
120120
)
121121

122+
def apply(
123+
self,
124+
container: 'RequiresContextFutureResult['
125+
'_EnvType, Callable[[_ValueType], _NewValueType], _ErrorType]',
126+
) -> 'RequiresContextFutureResult[_EnvType, _NewValueType, _ErrorType]':
127+
"""
128+
Calls a wrapped function in a container on this container.
129+
130+
.. code:: python
131+
132+
>>> import anyio
133+
>>> from returns.context import RequiresContextFutureResult
134+
>>> from returns.io import IOSuccess, IOFailure
135+
136+
>>> def transform(arg: str) -> str:
137+
... return arg + 'b'
138+
139+
>>> assert anyio.run(
140+
... RequiresContextFutureResult.from_value('a').apply(
141+
... RequiresContextFutureResult.from_value(transform),
142+
... ),
143+
... RequiresContextFutureResult.empty,
144+
... ) == IOSuccess('ab')
145+
146+
>>> assert anyio.run(
147+
... RequiresContextFutureResult.from_failure('a').apply(
148+
... RequiresContextFutureResult.from_value(transform),
149+
... ),
150+
... RequiresContextFutureResult.empty,
151+
... ) == IOFailure('a')
152+
153+
"""
154+
return RequiresContextFutureResult(
155+
lambda deps: self(deps).apply(container(deps)),
156+
)
157+
122158
def bind(
123159
self,
124160
function: Callable[
@@ -162,7 +198,7 @@ def bind(
162198
"""
163199
return RequiresContextFutureResult(
164200
lambda deps: self(deps).bind(
165-
lambda inner: function(inner)(deps), # type: ignore
201+
lambda inner: function(inner)(deps), # type: ignore[misc]
166202
),
167203
)
168204

@@ -216,7 +252,7 @@ def rescue(
216252
"""
217253
return RequiresContextFutureResult(
218254
lambda deps: self(deps).rescue(
219-
lambda inner: function(inner)(deps), # type: ignore
255+
lambda inner: function(inner)(deps), # type: ignore[misc]
220256
),
221257
)
222258

returns/context/requires_context_ioresult.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ def bind(
252252
"""
253253
return RequiresContextIOResult(
254254
lambda deps: self(deps).bind(
255-
lambda inner: function(inner)(deps), # type: ignore
255+
lambda inner: function(inner)(deps), # type: ignore[misc]
256256
),
257257
)
258258

@@ -322,7 +322,7 @@ def bind_context(
322322
"""
323323
return RequiresContextIOResult(
324324
lambda deps: self(deps).map(
325-
lambda inner: function(inner)(deps), # type: ignore
325+
lambda inner: function(inner)(deps), # type: ignore[misc]
326326
),
327327
)
328328

@@ -375,7 +375,7 @@ def bind_context_result(
375375
"""
376376
return RequiresContextIOResult(
377377
lambda deps: self(deps).bind_result(
378-
lambda inner: function(inner)(deps), # type: ignore
378+
lambda inner: function(inner)(deps), # type: ignore[misc]
379379
),
380380
)
381381

@@ -524,7 +524,7 @@ def rescue(
524524
"""
525525
return RequiresContextIOResult(
526526
lambda deps: self(deps).rescue(
527-
lambda inner: function(inner)(deps), # type: ignore
527+
lambda inner: function(inner)(deps), # type: ignore[misc]
528528
),
529529
)
530530

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ warn_unreachable = True
148148

149149
# We need this to debug `mypy` plugin:
150150
show_traceback = True
151+
show_error_codes = True
151152

152153

153154
[doc8]

typesafety/test_context/test_requires_context_future_result/test_requires_context_future_result.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@
88
reveal_type(x.map(bool)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.bool*, builtins.float]'
99
1010
11+
- case: requires_context_future_result_apply
12+
disable_cache: true
13+
main: |
14+
from typing import Callable
15+
from returns.context import RequiresContextFutureResult
16+
17+
x: RequiresContextFutureResult[str, int, float]
18+
y: RequiresContextFutureResult[str, Callable[[int], bool], float]
19+
20+
reveal_type(x.apply(y)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.bool*, builtins.float]'
21+
22+
1123
- case: requires_context_future_result_bind
1224
disable_cache: true
1325
main: |

typesafety/test_pointfree/test_apply.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,18 @@
9696
reveal_type(apply(test)) # N: Revealed type is 'def (returns.context.requires_context_ioresult.RequiresContextIOResult[builtins.bool*, builtins.float*, builtins.str*]) -> returns.context.requires_context_ioresult.RequiresContextIOResult[builtins.bool*, builtins.int*, builtins.str*]'
9797
9898
99+
- case: apply_requires_context_future_result
100+
disable_cache: true
101+
main: |
102+
from returns.pointfree import apply
103+
from returns.context import RequiresContextFutureResult
104+
from typing import Callable
105+
106+
test: RequiresContextFutureResult[bool, Callable[[float], int], str]
107+
108+
reveal_type(apply(test)) # N: Revealed type is 'def (returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.bool*, builtins.float*, builtins.str*]) -> returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.bool*, builtins.int*, builtins.str*]'
109+
110+
99111
- case: apply_future
100112
disable_cache: true
101113
main: |

0 commit comments

Comments
 (0)