Skip to content

Commit 9e2bd21

Browse files
committed
Copies unit methods from ReaderIOResult to ReaderFutureResult, refs #274
1 parent b107680 commit 9e2bd21

File tree

4 files changed

+295
-2
lines changed

4 files changed

+295
-2
lines changed

returns/context/requires_context_future_result.py

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
Callable,
77
ClassVar,
88
Generic,
9+
Iterable,
10+
Sequence,
911
TypeVar,
1012
Union,
1113
)
1214

1315
from typing_extensions import final
1416

1517
from returns._generated.futures import _future_result
18+
from returns._generated.iterable import iterable
1619
from returns.context import NoDeps
1720
from returns.future import FutureResult
1821
from returns.io import IO, IOResult
@@ -632,6 +635,184 @@ def failure(self) -> Callable[[_EnvType], Awaitable[IO[_ErrorType]]]:
632635
"""
633636
return lambda deps: _future_result.async_failure(self(deps))
634637

638+
@classmethod
639+
def from_result(
640+
cls, inner_value: Result[_ValueType, _ErrorType],
641+
) -> 'RequiresContextFutureResult[NoDeps, _ValueType, _ErrorType]':
642+
"""
643+
Creates new container with ``Result`` as a unit value.
644+
645+
.. code:: python
646+
647+
>>> import anyio
648+
>>> from returns.context import RequiresContextFutureResult
649+
>>> from returns.result import Success, Failure
650+
>>> from returns.io import IOSuccess, IOFailure
651+
652+
>>> assert anyio.run(
653+
... RequiresContextFutureResult.from_result(Success(1)),
654+
... RequiresContextFutureResult.empty,
655+
... ) == IOSuccess(1)
656+
657+
>>> assert anyio.run(
658+
... RequiresContextFutureResult.from_result(Failure(1)),
659+
... RequiresContextFutureResult.empty,
660+
... ) == IOFailure(1)
661+
662+
"""
663+
return RequiresContextFutureResult(
664+
lambda _: FutureResult.from_result(inner_value),
665+
)
666+
667+
@classmethod
668+
def from_ioresult(
669+
cls, inner_value: IOResult[_ValueType, _ErrorType],
670+
) -> 'RequiresContextFutureResult[NoDeps, _ValueType, _ErrorType]':
671+
"""
672+
Creates new container with ``IOResult`` as a unit value.
673+
674+
.. code:: python
675+
676+
>>> import anyio
677+
>>> from returns.context import RequiresContextFutureResult
678+
>>> from returns.io import IOSuccess, IOFailure
679+
680+
>>> assert anyio.run(
681+
... RequiresContextFutureResult.from_ioresult(IOSuccess(1)),
682+
... RequiresContextFutureResult.empty,
683+
... ) == IOSuccess(1)
684+
685+
>>> assert anyio.run(
686+
... RequiresContextFutureResult.from_ioresult(IOFailure(1)),
687+
... RequiresContextFutureResult.empty,
688+
... ) == IOFailure(1)
689+
690+
"""
691+
return RequiresContextFutureResult(
692+
lambda _: FutureResult.from_ioresult(inner_value),
693+
)
694+
695+
@classmethod
696+
def from_typecast(
697+
cls,
698+
container: 'RequiresContext['
699+
'_EnvType, FutureResult[_NewValueType, _NewErrorType]]',
700+
) -> 'RequiresContextFutureResult[_EnvType, _NewValueType, _NewErrorType]':
701+
"""
702+
You might end up with ``RequiresContext[FutureResult]`` as a value.
703+
704+
This method is designed to turn it into ``RequiresContextFutureResult``.
705+
It will save all the typing information.
706+
707+
It is just more useful!
708+
709+
.. code:: python
710+
711+
>>> import anyio
712+
>>> from returns.context import RequiresContext
713+
>>> from returns.future import FutureResult
714+
>>> from returns.io import IOSuccess, IOFailure
715+
716+
>>> assert anyio.run(
717+
... RequiresContextFutureResult.from_typecast(
718+
... RequiresContext.from_value(FutureResult.from_value(1)),
719+
... ),
720+
... RequiresContextFutureResult.empty,
721+
... ) == IOSuccess(1)
722+
723+
>>> assert anyio.run(
724+
... RequiresContextFutureResult.from_typecast(
725+
... RequiresContext.from_value(FutureResult.from_failure(1)),
726+
... ),
727+
... RequiresContextFutureResult.empty,
728+
... ) == IOFailure(1)
729+
730+
"""
731+
return RequiresContextFutureResult(container)
732+
733+
@classmethod
734+
def from_context(
735+
cls, inner_value: 'RequiresContext[_EnvType, _FirstType]',
736+
) -> 'RequiresContextFutureResult[_EnvType, _FirstType, Any]':
737+
"""
738+
Creates new container from ``RequiresContext`` as a success unit.
739+
740+
.. code:: python
741+
742+
>>> import anyio
743+
>>> from returns.context import RequiresContext
744+
>>> from returns.io import IOSuccess
745+
746+
>>> assert anyio.run(
747+
... RequiresContextFutureResult.from_context(
748+
... RequiresContext.from_value(1),
749+
... ),
750+
... RequiresContextFutureResult.empty,
751+
... ) == IOSuccess(1)
752+
753+
"""
754+
return RequiresContextFutureResult(
755+
lambda deps: FutureResult.from_value(inner_value(deps)),
756+
)
757+
758+
@classmethod
759+
def from_failed_context(
760+
cls, inner_value: 'RequiresContext[_EnvType, _FirstType]',
761+
) -> 'RequiresContextFutureResult[_EnvType, Any, _FirstType]':
762+
"""
763+
Creates new container from ``RequiresContext`` as a failure unit.
764+
765+
.. code:: python
766+
767+
>>> import anyio
768+
>>> from returns.context import RequiresContext
769+
>>> from returns.io import IOFailure
770+
771+
>>> assert anyio.run(
772+
... RequiresContextFutureResult.from_failed_context(
773+
... RequiresContext.from_value(1),
774+
... ),
775+
... RequiresContextFutureResult.empty,
776+
... ) == IOFailure(1)
777+
778+
"""
779+
return RequiresContextFutureResult(
780+
lambda deps: FutureResult.from_failure(inner_value(deps)),
781+
)
782+
783+
@classmethod
784+
def from_result_context(
785+
cls,
786+
inner_value: 'RequiresContextResult[_EnvType, _ValueType, _ErrorType]',
787+
) -> 'RequiresContextFutureResult[_EnvType, _ValueType, _ErrorType]':
788+
"""
789+
Creates new container from ``RequiresContextResult`` as a unit value.
790+
791+
.. code:: python
792+
793+
>>> import anyio
794+
>>> from returns.context import RequiresContextResult
795+
>>> from returns.io import IOSuccess, IOFailure
796+
797+
>>> assert anyio.run(
798+
... RequiresContextFutureResult.from_result_context(
799+
... RequiresContextResult.from_value(1),
800+
... ),
801+
... RequiresContextFutureResult.empty,
802+
... ) == IOSuccess(1)
803+
804+
>>> assert anyio.run(
805+
... RequiresContextFutureResult.from_result_context(
806+
... RequiresContextResult.from_failure(1),
807+
... ),
808+
... RequiresContextFutureResult.empty,
809+
... ) == IOFailure(1)
810+
811+
"""
812+
return RequiresContextFutureResult(
813+
lambda deps: FutureResult.from_result(inner_value(deps)),
814+
)
815+
635816
@classmethod
636817
def from_value(
637818
cls, inner_value: _FirstType,
@@ -676,6 +857,44 @@ def from_failure(
676857
lambda _: FutureResult.from_failure(inner_value),
677858
)
678859

860+
@classmethod
861+
def from_iterable(
862+
cls,
863+
containers:
864+
Iterable[
865+
'RequiresContextFutureResult[_EnvType, _ValueType, _ErrorType]',
866+
],
867+
) -> 'ReaderFutureResult[_EnvType, Sequence[_ValueType], _ErrorType]':
868+
"""
869+
Transforms an iterable of ``RequiresContextFutureResult`` containers.
870+
871+
Returns a single container with multiple elements inside.
872+
873+
.. code:: python
874+
875+
>>> import anyio
876+
>>> from returns.context import RequiresContextFutureResult
877+
>>> from returns.io import IOSuccess, IOFailure
878+
879+
>>> assert anyio.run(
880+
... RequiresContextFutureResult.from_iterable([
881+
... RequiresContextFutureResult.from_value(1),
882+
... RequiresContextFutureResult.from_value(2),
883+
... ]),
884+
... RequiresContextFutureResult.empty,
885+
... ) == IOSuccess((1, 2))
886+
887+
>>> assert anyio.run(
888+
... RequiresContextFutureResult.from_iterable([
889+
... RequiresContextFutureResult.from_value(1),
890+
... RequiresContextFutureResult.from_failure('a'),
891+
... ]),
892+
... RequiresContextFutureResult.empty,
893+
... ) == IOFailure('a')
894+
895+
"""
896+
return iterable(cls, containers)
897+
679898

680899
@final
681900
class ContextFutureResult(Immutable, Generic[_EnvType], metaclass=ABCMeta):

returns/context/requires_context_ioresult.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ def from_ioresult(
624624
cls, inner_value: IOResult[_ValueType, _ErrorType],
625625
) -> 'RequiresContextIOResult[NoDeps, _ValueType, _ErrorType]':
626626
"""
627-
Creates new container with ``Result`` as a unit value.
627+
Creates new container with ``IOResult`` as a unit value.
628628
629629
.. code:: python
630630

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ per-file-ignores =
5151
# Disable some quality checks for the most heavy parts:
5252
returns/io.py: WPS402
5353
# Some rules cannot be applied to context:
54-
returns/context/*.py: WPS204, WPS226, WPS326, WPS430, WPS433
54+
returns/context/*.py: WPS201, WPS204, WPS226, WPS326, WPS430, WPS433
5555
# We allow `futures` to do attribute access:
5656
returns/future.py: WPS437
5757
returns/_generated/futures/*.py: WPS204, WPS433, WPS437

typesafety/test_context/test_requires_context_future_result/test_requires_context_future_result_unit.yml

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,77 @@
1212
from returns.context import RequiresContextFutureResult
1313
1414
reveal_type(RequiresContextFutureResult.from_failure(1)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[Any, Any, builtins.int*]'
15+
16+
17+
- case: requires_context_future_result_from_iterable
18+
disable_cache: true
19+
main: |
20+
from returns.context import RequiresContextFutureResult
21+
from typing import Iterable
22+
23+
x: Iterable[RequiresContextFutureResult[str, int, float]]
24+
25+
reveal_type(RequiresContextFutureResult.from_iterable(x)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str*, typing.Sequence[builtins.int*], builtins.float*]'
26+
27+
28+
- case: requires_context_future_result_result
29+
disable_cache: true
30+
main: |
31+
from returns.context import RequiresContextFutureResult
32+
from returns.result import Result
33+
34+
r: Result[int, str]
35+
36+
reveal_type(RequiresContextFutureResult.from_result(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[Any, builtins.int*, builtins.str*]'
37+
38+
39+
- case: requires_context_future_result_future_result
40+
disable_cache: true
41+
main: |
42+
from returns.context import RequiresContextFutureResult
43+
from returns.io import IOResult
44+
45+
r: IOResult[int, str]
46+
47+
reveal_type(RequiresContextFutureResult.from_ioresult(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[Any, builtins.int*, builtins.str*]'
48+
49+
50+
- case: requires_context_future_result_typecast
51+
disable_cache: true
52+
main: |
53+
from returns.context import RequiresContextFutureResult, RequiresContext
54+
from returns.future import FutureResult
55+
56+
r: RequiresContext[float, FutureResult[int, str]]
57+
58+
reveal_type(RequiresContextFutureResult.from_typecast(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.float*, builtins.int*, builtins.str*]'
59+
60+
61+
- case: requires_context_future_result_successful_context
62+
disable_cache: true
63+
main: |
64+
from returns.context import RequiresContextFutureResult, RequiresContext
65+
66+
r: RequiresContext[float, str]
67+
68+
reveal_type(RequiresContextFutureResult.from_context(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.float*, builtins.str*, Any]'
69+
70+
71+
- case: requires_context_future_result_failed_context
72+
disable_cache: true
73+
main: |
74+
from returns.context import RequiresContextFutureResult, RequiresContext
75+
76+
r: RequiresContext[float, str]
77+
78+
reveal_type(RequiresContextFutureResult.from_failed_context(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.float*, Any, builtins.str*]'
79+
80+
81+
- case: requires_context_future_result_from_result_context
82+
disable_cache: true
83+
main: |
84+
from returns.context import RequiresContextFutureResult, RequiresContextResult
85+
86+
r: RequiresContextResult[float, int, str]
87+
88+
reveal_type(RequiresContextFutureResult.from_result_context(r)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.float*, builtins.int*, builtins.str*]'

0 commit comments

Comments
 (0)