Skip to content

Commit a37a047

Browse files
committed
Adds more unit methods to RequiresContextFutureResult, refs #274
1 parent 32e4acd commit a37a047

File tree

3 files changed

+173
-3
lines changed

3 files changed

+173
-3
lines changed

docs/pages/context.rst

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,9 @@ How to create unit objects?
424424
- ``from_io`` when you have successful ``IO`` container
425425
- ``from_failed_io`` when you have failed ``IO`` container
426426
- ``from_ioresult`` when you already have ``IOResult`` container
427-
- ``from_context`` when you have successful ``RequiresContext``
428-
- ``from_failed_context`` when you have failed ``RequiresContext``
427+
- ``from_context`` when you have successful ``RequiresContext`` container
428+
- ``from_failed_context`` when you have failed ``RequiresContext`` container
429+
- ``from_result_context`` when you have ``RequiresContextResult`` container
429430
- ``from_typecast`` when you have ``RequiresContext[..., IOResult]``
430431

431432
``RequiresContextFutureResult`` requires
@@ -437,8 +438,13 @@ you to use one of the following methods:
437438
- ``from_io`` when you have successful ``IO`` container
438439
- ``from_failed_io`` when you have failed ``IO`` container
439440
- ``from_ioresult`` when you already have ``IOResult`` container
441+
- ``from_future`` when you already have successful ``Future`` container
442+
- ``from_failed_future`` when you already have failed ``Future`` container
443+
- ``from_future_result`` when you already have ``FutureResult`` container
440444
- ``from_context`` when you have successful ``RequiresContext``
441445
- ``from_failed_context`` when you have failed ``RequiresContext``
446+
- ``from_result_context`` when you have ``RequiresContextResult`` container
447+
- ``from_ioresult_context`` when you have ``RequiresContextIOResult`` container
442448
- ``from_typecast`` when you have ``RequiresContext[..., IOResult]``
443449

444450
How can I access dependencies inside the context?

returns/context/requires_context_future_result.py

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from returns._generated.futures import _future_result
1818
from returns._generated.iterable import iterable
1919
from returns.context import NoDeps
20-
from returns.future import FutureResult
20+
from returns.future import Future, FutureResult
2121
from returns.io import IO, IOResult
2222
from returns.primitives.container import BaseContainer
2323
from returns.primitives.types import Immutable
@@ -26,6 +26,9 @@
2626
if TYPE_CHECKING:
2727
from returns.context.requires_context import RequiresContext
2828
from returns.context.requires_context_result import RequiresContextResult
29+
from returns.context.requires_context_ioresult import (
30+
RequiresContextIOResult,
31+
)
2932

3033
# Context:
3134
_EnvType = TypeVar('_EnvType', contravariant=True)
@@ -740,6 +743,90 @@ def from_ioresult(
740743
lambda _: FutureResult.from_ioresult(inner_value),
741744
)
742745

746+
@classmethod
747+
def from_future(
748+
cls,
749+
inner_value: Future[_ValueType],
750+
) -> 'RequiresContextFutureResult[NoDeps, _ValueType, Any]':
751+
"""
752+
Creates new container with successful ``Future`` as a unit value.
753+
754+
.. code:: python
755+
756+
>>> import anyio
757+
>>> from returns.context import RequiresContextFutureResult
758+
>>> from returns.future import Future
759+
>>> from returns.io import IOSuccess
760+
761+
>>> assert anyio.run(
762+
... RequiresContextFutureResult.from_future(Future.from_value(1)),
763+
... RequiresContextFutureResult.empty,
764+
... ) == IOSuccess(1)
765+
766+
"""
767+
return RequiresContextFutureResult(
768+
lambda _: FutureResult.from_future(inner_value),
769+
)
770+
771+
@classmethod
772+
def from_failed_future(
773+
cls,
774+
inner_value: Future[_ErrorType],
775+
) -> 'RequiresContextFutureResult[NoDeps, Any, _ErrorType]':
776+
"""
777+
Creates new container with failed ``Future`` as a unit value.
778+
779+
.. code:: python
780+
781+
>>> import anyio
782+
>>> from returns.context import RequiresContextFutureResult
783+
>>> from returns.future import Future
784+
>>> from returns.io import IOSuccess
785+
786+
>>> assert anyio.run(
787+
... RequiresContextFutureResult.from_failed_future(
788+
... Future.from_value(1),
789+
... ),
790+
... RequiresContextFutureResult.empty,
791+
... ) == IOSuccess(1)
792+
793+
"""
794+
return RequiresContextFutureResult(
795+
lambda _: FutureResult.from_failed_future(inner_value),
796+
)
797+
798+
@classmethod
799+
def from_future_result(
800+
cls,
801+
inner_value: FutureResult[_ValueType, _ErrorType],
802+
) -> 'RequiresContextFutureResult[NoDeps, _ValueType, _ErrorType]':
803+
"""
804+
Creates new container with ``FutureResult`` as a unit value.
805+
806+
.. code:: python
807+
808+
>>> import anyio
809+
>>> from returns.context import RequiresContextFutureResult
810+
>>> from returns.future import FutureResult
811+
>>> from returns.io import IOSuccess, IOFailure
812+
813+
>>> assert anyio.run(
814+
... RequiresContextFutureResult.from_future_result(
815+
... FutureResult.from_value(1),
816+
... ),
817+
... RequiresContextFutureResult.empty,
818+
... ) == IOSuccess(1)
819+
820+
>>> assert anyio.run(
821+
... RequiresContextFutureResult.from_future_result(
822+
... FutureResult.from_failure(1),
823+
... ),
824+
... RequiresContextFutureResult.empty,
825+
... ) == IOFailure(1)
826+
827+
"""
828+
return RequiresContextFutureResult(lambda _: inner_value)
829+
743830
@classmethod
744831
def from_typecast(
745832
cls,
@@ -861,6 +948,40 @@ def from_result_context(
861948
lambda deps: FutureResult.from_result(inner_value(deps)),
862949
)
863950

951+
@classmethod
952+
def from_ioresult_context(
953+
cls,
954+
inner_value:
955+
'RequiresContextIOResult[_EnvType, _ValueType, _ErrorType]',
956+
) -> 'RequiresContextFutureResult[_EnvType, _ValueType, _ErrorType]':
957+
"""
958+
Creates new container from ``RequiresContextIOResult`` as a unit value.
959+
960+
.. code:: python
961+
962+
>>> import anyio
963+
>>> from returns.context import RequiresContextIOResult
964+
>>> from returns.io import IOSuccess, IOFailure
965+
966+
>>> assert anyio.run(
967+
... RequiresContextFutureResult.from_ioresult_context(
968+
... RequiresContextIOResult.from_value(1),
969+
... ),
970+
... RequiresContextFutureResult.empty,
971+
... ) == IOSuccess(1)
972+
973+
>>> assert anyio.run(
974+
... RequiresContextFutureResult.from_ioresult_context(
975+
... RequiresContextIOResult.from_failure(1),
976+
... ),
977+
... RequiresContextFutureResult.empty,
978+
... ) == IOFailure(1)
979+
980+
"""
981+
return RequiresContextFutureResult(
982+
lambda deps: FutureResult.from_ioresult(inner_value(deps)),
983+
)
984+
864985
@classmethod
865986
def from_value(
866987
cls, inner_value: _FirstType,

typesafety/test_context/test_requires_context_future_result/test_requires_context_future_result_unit.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,39 @@
6969
reveal_type(RequiresContextFutureResult.from_ioresult(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[Any, builtins.int*, builtins.str*]'
7070
7171
72+
- case: requires_context_future_result_future
73+
disable_cache: true
74+
main: |
75+
from returns.context import RequiresContextFutureResult
76+
from returns.future import Future
77+
78+
r: Future[int]
79+
80+
reveal_type(RequiresContextFutureResult.from_future(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[Any, builtins.int*, Any]'
81+
82+
83+
- case: requires_context_future_result_failed_future
84+
disable_cache: true
85+
main: |
86+
from returns.context import RequiresContextFutureResult
87+
from returns.future import Future
88+
89+
r: Future[int]
90+
91+
reveal_type(RequiresContextFutureResult.from_failed_future(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[Any, Any, builtins.int*]'
92+
93+
94+
- case: requires_context_future_result_future_result
95+
disable_cache: true
96+
main: |
97+
from returns.context import RequiresContextFutureResult
98+
from returns.future import FutureResult
99+
100+
r: FutureResult[int, str]
101+
102+
reveal_type(RequiresContextFutureResult.from_future_result(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[Any, builtins.int*, builtins.str*]'
103+
104+
72105
- case: requires_context_future_result_typecast
73106
disable_cache: true
74107
main: |
@@ -108,3 +141,13 @@
108141
r: RequiresContextResult[float, int, str]
109142
110143
reveal_type(RequiresContextFutureResult.from_result_context(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.float*, builtins.int*, builtins.str*]'
144+
145+
146+
- case: requires_context_future_result_from_ioresult_context
147+
disable_cache: true
148+
main: |
149+
from returns.context import RequiresContextFutureResult, RequiresContextIOResult
150+
151+
r: RequiresContextIOResult[float, int, str]
152+
153+
reveal_type(RequiresContextFutureResult.from_ioresult_context(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.float*, builtins.int*, builtins.str*]'

0 commit comments

Comments
 (0)