Source code for returns._internal.pipeline.flow
from functools import reduce
from typing import TypeVar
_InstanceType = TypeVar('_InstanceType')
_PipelineStepType = TypeVar('_PipelineStepType')
_ReturnType = TypeVar('_ReturnType')
[docs]def flow(
instance: _InstanceType,
*functions: _PipelineStepType,
) -> _ReturnType: # type: ignore[type-var]
"""
Allows to compose a value and up to multiple functions that use this value.
All starts with the value itself.
Each next function uses the previous result as an input parameter.
We use a custom ``mypy`` plugin to make sure types are correct.
Otherwise, it is currently impossible to properly type this function.
Currently, ``flow`` has a hard limit of 21 steps.
Because, it is not possible to type it otherwise.
We need a hard limit.
See: https://github.com/dry-python/returns/issues/461
Here's how it should be used:
.. code:: python
>>> from returns.pipeline import flow
>>> # => executes: str(float(int('1')))
>>> assert flow('1', int, float, str) == '1.0'
This function is closely related
to :func:`pipe <returns._internal.pipeline.pipe.pipe>`:
.. code:: python
>>> from returns.pipeline import pipe
>>> assert flow('1', int, float, str) == pipe(int, float, str)('1')
See also:
- https://stackoverflow.com/a/41585450/4842742
- https://github.com/gcanti/fp-ts/blob/master/src/pipeable.ts
Requires our :ref:`mypy plugin <mypy-plugins>`.
"""
return reduce( # type: ignore
lambda composed, function: function(composed), # type: ignore
functions,
instance,
)