Source code for returns._generated.converters.squash

# -*- coding: utf-8 -*-

from returns.context import RequiresContext
from returns.io import IO


def _squash_io(*args):
    """
    Unwraps ``IO`` values, merges them into tuple, and wraps back.

    .. code:: python

        >>> from returns.io import IO
        >>> from returns.converters import squash_io
        >>> assert squash_io(IO('a'), IO('b')) == IO(('a', 'b'))

    Why this only exists for ``IO`` and ``RequiresContext``?
    Because these types represent real values, that do not possibly fail.

    How would you, for example, squash two ``Result`` values?
    ``Success(1)`` and ``Failure(2)`` would not give you a tuple when squashed.
    """
    return IO(tuple(
        container._inner_value  # noqa:  WPS437
        for container in args
    ))


def _squash_context(*args):
    """
    Unwraps ``RequiresContext`` values, merges them into tuple, and wraps back.

    .. code:: python

        >>> from returns.context import RequiresContext
        >>> from returns.converters import squash_context
        >>> assert squash_context(
        ...     RequiresContext.from_value(1),
        ...     RequiresContext.from_value('a'),
        ...     RequiresContext.from_value(True),
        ... )(...) == RequiresContext.from_value((1, 'a', True))(...)

    See :func:`returns.converters.squash_io` for more docs.
    """
    return RequiresContext(lambda deps: tuple(
        func(deps)
        for func in args
    ))