Skip to content

Commit f50121b

Browse files
committed
Refs #243
1 parent 5bbd369 commit f50121b

File tree

13 files changed

+1011
-31
lines changed

13 files changed

+1011
-31
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ See [0Ver](https://0ver.org/).
3636
- Adds `IOResult` support for `fold`
3737
- Adds `IOResult` support for `is_successful`
3838

39+
- Adds `RequiresContextIOResult` container
40+
- Adds `RequiresContextIOResultE` alias
41+
for `RequiresContextIOResult[..., ..., Exception]`
42+
- Adds `RequiresContextIOResult` support for `bind` and `rescue`
43+
- Adds `RequiresContextIOResult` support for `flatten`
44+
3945
- Adds `Result.lift`, `Maybe.lift`, `RequiresContext.lift`,
4046
and `RequiresContextResult.lift` functions in addition to `IO.lift`
4147
- Adds `Immutable` primitive type

docs/pages/container.rst

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ while maintaining the execution context.
1010
List of supported containers:
1111

1212
- :class:`Maybe <returns.maybe.Maybe>` to handle ``None`` cases
13-
- :class:`RequiresContext <returns.context.requires_context.RequiresContext>`
14-
to pass context to your functions
15-
- :class:`IO <returns.io.IO>` to mark explicit ``IO`` actions
1613
- :class:`Result <returns.result.Result>` to handle possible exceptions
14+
- :class:`IO <returns.io.IO>` to mark explicit ``IO`` actions
15+
- :class:`RequiresContext <returns.context.requires_context.RequiresContext>`
16+
to pass context to your functions (DI and similar)
17+
18+
There are also some combintations like
1719

1820
We will show you container's simple API of one attribute
1921
and several simple methods.
@@ -178,12 +180,20 @@ Needs transformation
178180
use :func:`result_to_maybe <returns.converters.result_to_maybe>`
179181
and then :func:`flatten <returns.converters.flatten>`
180182
- ``RequiresContext[env, Result[A, B]]`` 🤔,
181-
use :meth:`returns.context.requires_context_result.from_typecast`
183+
use
184+
:meth:`returns.context.requires_context_result.RequiresContextResult.from_typecast`
182185
and ``RequiresResultContext``
183186
- ``RequiresContext[env, RequiresContext[env, A]]`` 🤔,
184187
use :func:`flatten <returns.converters.flatten>`
185188
- ``RequiresContextResult[env, RequiresContextResult[env, A, B], B]`` 🤔,
186189
use :func:`flatten <returns.converters.flatten>`
190+
- ``RequiresContext[env, IOResult[A, B]]`` 🤔,
191+
use
192+
:meth:`returns.context.requires_context_io_result.RequiresContextIOResult.from_typecast`
193+
and ``RequiresResultContext``
194+
- ``RequiresContextIOResult[env, RequiresContextIOResult[env, A, B], B]``
195+
🤔,
196+
use :func:`flatten <returns.converters.flatten>`
187197

188198
Nope
189199
~~~~
@@ -194,6 +204,7 @@ Nope
194204
- ``Result[A, Result[B, C]]`` 🚫
195205
- ``Maybe[IO[A]]`` 🚫
196206
- ``RequiresContext[IO[A], B]`` 🚫
207+
- ``IO[RequiresContext[A, B]`` 🚫
197208

198209
You can use :ref:`converters` to convert ``Maybe`` and ``Result`` containers.
199210
You can also use :func:`flatten <returns.converters.flatten>`

docs/pages/context.rst

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,15 @@ But, think twice: why would you need to do it?
321321
These classes represent computations that rely on context.
322322
Maybe, you should not do creat their units?
323323

324+
``RequiresContextIOResult`` requires you to use one of the following methods:
325+
326+
- ``from_success`` when you want to mark some raw value as a ``Success``
327+
- ``from_failure`` when you want to mark some raw value as a ``Failure``
328+
- ``from_result`` when you already have ``Result`` container
329+
- ``from_ioresult`` when you already have ``IOResult`` container
330+
- ``from_successful_context`` when you have successful ``RequiresContext``
331+
- ``from_failed_context`` when you have failed ``RequiresContext``
332+
324333
How can I access dependencies inside the context?
325334
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
326335

@@ -373,3 +382,11 @@ RequiresContextResult
373382

374383
.. automodule:: returns.context.requires_context_result
375384
:members:
385+
386+
RequiresContextIOResult
387+
~~~~~~~~~~~~~~~~~~~~~
388+
389+
.. autoclasstree:: returns.context.requires_context_io_result
390+
391+
.. automodule:: returns.context.requires_context_io_result
392+
:members:

returns/_generated/flatten.pyi

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
from typing import TypeVar, overload
44

5-
from returns.context import RequiresContext, RequiresContextResult
5+
from returns.context import (
6+
RequiresContext,
7+
RequiresContextIOResult,
8+
RequiresContextResult,
9+
)
610
from returns.io import IO, IOResult
711
from returns.maybe import Maybe
812
from returns.result import Result
@@ -54,3 +58,14 @@ def _flatten(
5458
],
5559
) -> RequiresContextResult[_EnvType, _ValueType, _ErrorType]:
5660
...
61+
62+
63+
@overload
64+
def _flatten(
65+
container: RequiresContextIOResult[
66+
_EnvType,
67+
RequiresContextIOResult[_EnvType, _ValueType, _ErrorType],
68+
_ErrorType,
69+
],
70+
) -> RequiresContextIOResult[_EnvType, _ValueType, _ErrorType]:
71+
...

returns/_generated/pointfree/bind.pyi

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
from typing import Callable, TypeVar, overload
44

5-
from returns.context import RequiresContext, RequiresContextResult
5+
from returns.context import (
6+
RequiresContext,
7+
RequiresContextIOResult,
8+
RequiresContextResult,
9+
)
610
from returns.io import IO, IOResult
711
from returns.maybe import Maybe
812
from returns.result import Result
@@ -52,6 +56,19 @@ def _bind(
5256
...
5357

5458

59+
@overload
60+
def _bind(
61+
function: Callable[
62+
[_ValueType],
63+
RequiresContextIOResult[_EnvType, _NewValueType, _ErrorType],
64+
],
65+
) -> Callable[
66+
[RequiresContextIOResult[_EnvType, _ValueType, _ErrorType]],
67+
RequiresContextIOResult[_EnvType, _NewValueType, _ErrorType],
68+
]:
69+
...
70+
71+
5572
@overload
5673
def _bind(
5774
function: Callable[[_ValueType], Result[_NewValueType, _ErrorType]],

returns/_generated/pointfree/rescue.pyi

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from typing import Callable, TypeVar, overload
44

5-
from returns.context import RequiresContextResult
5+
from returns.context import RequiresContextIOResult, RequiresContextResult
66
from returns.io import IOResult
77
from returns.result import Result
88

@@ -47,3 +47,16 @@ def _rescue(
4747
RequiresContextResult[_EnvType, _ValueType, _NewErrorType],
4848
]:
4949
...
50+
51+
52+
@overload
53+
def _rescue(
54+
function: Callable[
55+
[_ErrorType],
56+
RequiresContextIOResult[_EnvType, _ValueType, _NewErrorType],
57+
],
58+
) -> Callable[
59+
[RequiresContextIOResult[_EnvType, _ValueType, _ErrorType]],
60+
RequiresContextIOResult[_EnvType, _ValueType, _NewErrorType],
61+
]:
62+
...

returns/context/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,8 @@
1515
RequiresContextResult as RequiresContextResult,
1616
RequiresContextResultE as RequiresContextResultE,
1717
)
18+
from returns.context.requires_context_io_result import ( # noqa: F401
19+
ContextIOResult as ContextIOResult,
20+
RequiresContextIOResult as RequiresContextIOResult,
21+
RequiresContextIOResultE as RequiresContextIOResultE,
22+
)

0 commit comments

Comments
 (0)