aboutsummaryrefslogtreecommitdiff
"""
This module will contain helper functions that should assist in maintaining a
mostly functional way of programming.

It will also contain miscellaneous functions that can be used globally, and thus
do not fit well in any other module.

FUNCTIONS:
compose: This function is used to compose multiple functions into a single
    function. It passes the results of calling one function to the other until
    all the functions to be composed are called.
"""
from functools import reduce

def compose(*functions):
    """Compose multiple functions into a single function.

    The utility in this function is not specific to this module, and as such,
    this function can, and probably should, be moved to a more global module.

    DESCRIPTION:
    Given `cfn = compose(f_1, f_2, ... f_(n-1), f_n )`, calling
    `cfn(arg_1, arg_2, ..., arg_m)` should call `f_n` with the arguments passed
    to `cfn` and the results of that should be passed as arguments to `f_(n-1)`
    and so on until `f_1` is called with the results of the cumulative calls and
    that is the result of the entire chain of calls.

    PARAMETERS:
    functions: a variable argument list of function.
    """
    def composed_function(*args, **kwargs):
        return reduce(
            lambda res, fn: fn(res),
            reversed(functions[:-1]),
            functions[-1](*args, **kwargs))
    return composed_function