withInsertedItem(index, item) {
        if (index < 0) {
            throw new Error("needed index >= 0");
        }
        let self = this;
        return Seq.fromGenerator(function*() {
            if (self.tryPeekCount() !== undefined && index > self.tryPeekCount()) {
                throw new Error("needed index <= count");
            }
            let i = 0;
            for (let e of self._iterable) {
                if (i === index) {
                    yield item;
                }
                i++;
                yield e;
            }
            if (i === index) {
                yield item;
            }
            if (i < index) {
                throw new Error("sequence ended before insertion [withInsertedItem(${index}, ${item})]");
            }
        });
    }
Returns a sequence with the same items, except the given extra item is yielded when the given index is reached.
If the insertion index is the length of the sequence, the inserted item is the last yielded item.
If the insertion index is past the length of the sequence, an error is thrown (but only at the end of iteration).

@param {A} item
@param {!int} index
@returns {!Seq.<T|A>}
@template T, A