Source code for warg.manipulation

#!/usr/bin/env python3

__author__ = "Christian Heider Lindbjerg"
__doc__ = r"""

           Created on 23/07/2020
           """

__all__ = ["recursive_flatten"]


import logging
from typing import Iterable, Sequence

_logger = logging.getLogger(__name__)


def recursive_flatten_seq(seq: Sequence) -> Sequence:
    """Depth first flatten"""
    if not seq:  # is empty Sequence
        return seq
    if isinstance(seq[0], Sequence):
        return (*recursive_flatten(seq[0]), *recursive_flatten(seq[1:]))
    return (*seq[:1], *recursive_flatten(seq[1:]))


[docs] def recursive_flatten(sequence: Iterable) -> Iterable: """ Depth first flattens iterable >>> list(recursive_flatten([1, [2], 3])) [1, 2, 3] >>> list(recursive_flatten([1, [2], [3, [4]]])) [1, 2, 3, 4] >>> list(recursive_flatten((([[None]], 2), (2,), 2))) [None, 2, 2, 2] """ for element in sequence: if isinstance(element, Iterable) and not isinstance(element, str): yield from recursive_flatten(element) else: yield element
if __name__ == "__main__": _logger.info(list(recursive_flatten((((2,), 2), (2,), 2)))) _logger.info(list(recursive_flatten(((("2",), 2), (2,), 2)))) _logger.info(list(recursive_flatten((([[None]], 2), (2,), 2)))) _logger.info(list(recursive_flatten((([[None]], 2), (2,), 2))))