def sieve(iterable, indicator):
    """Split an iterable into two lists by a boolean indicator function. Unlike
    `partition()` in iters.py, this does not clone the iterable twice. Instead,
    it run the iterable once and return two lists.

    Args:
        iterable: iterable of finite items. This function will scan it until the
                  end
        indicator: an executable function that takes an argument and returns a
                   boolean
    Returns:
        A tuple (positive, negative), which each items are from the iterable and
        tested with the indicator function
    """
    positive = []
    negative = []
    for item in iterable:
        (positive if indicator(item) else negative).append(item)
    return positive, negative