def chunkify(iterable, n, drop_incomplete=False):
    """Return a generator providing chunks (lists of size n) of the iterable.

    >>> tuple(chunkify(range(10), 5))  # len(iterable) % n == 0
    ([0, 1, 2, 3, 4], [5, 6, 7, 8, 9])
    >>> tuple(chunkify(range(12), 5))  # len(iterable) % n != 0
    ([0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11])
    >>> tuple(chunkify([], 100))       # Empty iterable example
    ([],)
    """
    offset = 0
    ret = [None] * n
    i = -1
    for i, e in enumerate(iterable):
        if i - offset == n:
            yield ret
            offset += n
            ret = [None] * n
        ret[i - offset] = e
    last_n = i - offset + 1
    if last_n == n or not drop_incomplete:
        yield ret[:last_n]
