Take and yield items in an iterable until the passed predicate fails, then abort the sequence
function takeWhile(predicate) {
    return function* (iterable) {
        let i = 0;
        for (const item of iterable) {
            if (!predicate(item, i)) {
                break;
            }
            yield item;
            i = i + 1;
        }
    };
}