Skip to content

Commit

Permalink
Adds .alt and .fix methods, refs #274
Browse files Browse the repository at this point in the history
  • Loading branch information
sobolevn committed Jun 4, 2020
1 parent 192888e commit 44f9e4c
Show file tree
Hide file tree
Showing 6 changed files with 142 additions and 2 deletions.
15 changes: 14 additions & 1 deletion returns/_generated/pointfree/alt.pyi
Expand Up @@ -2,7 +2,11 @@ from typing import Callable, TypeVar, overload

from typing_extensions import Protocol

from returns.context import RequiresContextIOResult, RequiresContextResult
from returns.context import (
RequiresContextFutureResult,
RequiresContextIOResult,
RequiresContextResult,
)
from returns.future import FutureResult
from returns.io import IOResult
from returns.result import Result
Expand Down Expand Up @@ -37,6 +41,15 @@ class _Altable(Protocol[_ErrorType, _NewErrorType]):
) -> RequiresContextIOResult[_EnvType, _ValueType, _NewErrorType]:
...

@overload
def __call__(
self,
container: RequiresContextFutureResult[
_EnvType, _ValueType, _ErrorType,
],
) -> RequiresContextFutureResult[_EnvType, _ValueType, _NewErrorType]:
...

@overload
def __call__(
self,
Expand Down
15 changes: 14 additions & 1 deletion returns/_generated/pointfree/fix.pyi
Expand Up @@ -2,7 +2,11 @@ from typing import Callable, TypeVar, overload

from typing_extensions import Protocol

from returns.context import RequiresContextIOResult, RequiresContextResult
from returns.context import (
RequiresContextFutureResult,
RequiresContextIOResult,
RequiresContextResult,
)
from returns.future import FutureResult
from returns.io import IOResult
from returns.result import Result
Expand Down Expand Up @@ -37,6 +41,15 @@ class _Fixable(Protocol[_ErrorType, _NewValueType]):
) -> RequiresContextIOResult[_EnvType, _NewValueType, _ErrorType]:
...

@overload
def __call__(
self,
container: RequiresContextFutureResult[
_EnvType, _ValueType, _ErrorType,
],
) -> RequiresContextFutureResult[_EnvType, _NewValueType, _ErrorType]:
...

@overload
def __call__(
self,
Expand Down
62 changes: 62 additions & 0 deletions returns/context/requires_context_future_result.py
Expand Up @@ -202,6 +202,68 @@ def bind(
),
)

def fix(
self, function: Callable[[_ErrorType], _NewValueType],
) -> 'RequiresContextFutureResult[_EnvType, _NewValueType, _ErrorType]':
"""
Composes failed container with a pure function.
.. code:: python
>>> import anyio
>>> from returns.context import RequiresContextFutureResult
>>> from returns.io import IOSuccess
>>> assert anyio.run(
... RequiresContextFutureResult.from_value(1).fix(
... lambda x: x + 1,
... ),
... RequiresContextFutureResult.empty,
... ) == IOSuccess(1)
>>> assert anyio.run(
... RequiresContextFutureResult.from_failure(1).fix(
... lambda x: x + 1,
... ),
... RequiresContextFutureResult.empty,
... ) == IOSuccess(2)
"""
return RequiresContextFutureResult(
lambda deps: self(deps).fix(function),
)

def alt(
self, function: Callable[[_ErrorType], _NewErrorType],
) -> 'RequiresContextFutureResult[_EnvType, _ValueType, _NewErrorType]':
"""
Composes failed container with a pure function.
.. code:: python
>>> import anyio
>>> from returns.context import RequiresContextFutureResult
>>> from returns.io import IOSuccess, IOFailure
>>> assert anyio.run(
... RequiresContextFutureResult.from_value(1).alt(
... lambda x: x + 1,
... ),
... RequiresContextFutureResult.empty,
... ) == IOSuccess(1)
>>> assert anyio.run(
... RequiresContextFutureResult.from_failure(1).alt(
... lambda x: x + 1,
... ),
... RequiresContextFutureResult.empty,
... ) == IOFailure(2)
"""
return RequiresContextFutureResult(
lambda deps: self(deps).alt(function),
)

def rescue(
self,
function: Callable[
Expand Down
Expand Up @@ -46,6 +46,32 @@
reveal_type(x.rescue(test)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.int, builtins.bool*]'
- case: requires_context_future_result_fix
disable_cache: true
main: |
from returns.context import RequiresContextFutureResult
x: RequiresContextFutureResult[str, int, float]
def test(param: float) -> bool:
...
reveal_type(x.fix(test)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.bool*, builtins.float]'
- case: requires_context_future_result_alt
disable_cache: true
main: |
from returns.context import RequiresContextFutureResult
x: RequiresContextFutureResult[str, int, float]
def test(param: float) -> bool:
...
reveal_type(x.alt(test)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.str, builtins.int, builtins.bool*]'
- case: requires_context_future_result_value_or
disable_cache: true
main: |
Expand Down
13 changes: 13 additions & 0 deletions typesafety/test_pointfree/test_alt.yml
Expand Up @@ -113,6 +113,19 @@
reveal_type(alt(test)(x)) # N: Revealed type is 'returns.context.requires_context_ioresult.RequiresContextIOResult[builtins.bool*, builtins.str*, builtins.int]'
- case: alt_requires_context_future_result
disable_cache: true
main: |
from returns.pointfree import alt
from returns.context import RequiresContextFutureResult
def test(arg: float) -> int:
...
x: RequiresContextFutureResult[bool, str, float]
reveal_type(alt(test)(x)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.bool*, builtins.str*, builtins.int]'
- case: alt_futureresult
disable_cache: true
main: |
Expand Down
13 changes: 13 additions & 0 deletions typesafety/test_pointfree/test_fix.yml
Expand Up @@ -115,6 +115,19 @@
reveal_type(fix(test)(x)) # N: Revealed type is 'returns.context.requires_context_ioresult.RequiresContextIOResult[builtins.bool*, builtins.int, builtins.float]'
- case: fix_requires_context_future_result
disable_cache: true
main: |
from returns.pointfree import fix
from returns.context import RequiresContextFutureResult
def test(arg: float) -> int:
...
x: RequiresContextFutureResult[bool, str, float]
reveal_type(fix(test)(x)) # N: Revealed type is 'returns.context.requires_context_future_result.RequiresContextFutureResult[builtins.bool*, builtins.int, builtins.float]'
- case: fix_futureresult
disable_cache: true
main: |
Expand Down

0 comments on commit 44f9e4c

Please sign in to comment.