def scanl(f: Callable[[T, U], T], x: T, xs: Iterable[U]) -> Iterator[T]:
    """ Make an iterator that returns accumulated results of a binary function
    applied to elements of an iterable.

    .. math::
        scanl(f, x_0, [x_1, x_2, ...]) = [x_0, f(x_0, x_1), f(f(x_0, x_1), x_2), ...]

    Parameters
    ----------
    f
        A binary function of two arguments of type T.
    x
        An initializer element of type T.
    xs
        An iterable of elements of type T. 

    Returns
    -------
    Iterator
        The iterator of accumulated results.


    Examples
    --------
    >>> from delphi.utils.fp import scanl
    >>> list(scanl(lambda x, y: x + y, 10, range(5)))
    [10, 10, 11, 13, 16, 20]

    """

    return accumulate(prepend(x, xs), f)
Make an iterator that returns accumulated results of a binary function
    applied to elements of an iterable.

    .. math::
        scanl(f, x_0, [x_1, x_2, ...]) = [x_0, f(x_0, x_1), f(f(x_0, x_1), x_2), ...]

    Parameters
    ----------
    f
        A binary function of two arguments of type T.
    x
        An initializer element of type T.
    xs
        An iterable of elements of type T. 

    Returns
    -------
    Iterator
        The iterator of accumulated results.


    Examples
    --------
    >>> from delphi.utils.fp import scanl
    >>> list(scanl(lambda x, y: x + y, 10, range(5)))
    [10, 10, 11, 13, 16, 20]