> it.relative_seek(-2)  # Seeking relative to the current position
    >>> next(it)
    '9'
    >>> it.seek(20)  # Seeking past the end of the source isn't a problem
    >>> list(it)
    []
    >>> it.seek(0)  # Resetting works even after hitting the end
    >>> next(it), next(it), next(it)
    ('0', '1', '2')

Call :meth:`peek` to look ahead one item without advancing the iterator:

    >>> it = seekable('1234')
    >>> it.peek()
    '1'
    >>> list(it)
    ['1', '2', '3', '4']
    >>> it.peek(default='empty')
    'empty'

Before the iterator is at its end, calling :func:`bool` on it will return
``True``. After it will return ``False``:

    >>> it = seekable('5678')
    >>> bool(it)
    True
    >>> list(it)
    ['5', '6', '7', '8']
    >>> bool(it)
    False

You may view the contents of the cache with the :meth:`elements` method.
That returns a :class:`SequenceView`, a view that updates automatically:

    >>> it = seekable((str(n) for n in range(10)))
    >>> next(it), next(it), next(it)
    ('0', '1', '2')
    >>> elements = it.elements()
    >>> elements
    SequenceView(['0', '1', '2'])
    >>> next(it)
    '3'
    >>> elements
    SequenceView(['0', '1', '2', '3'])

By default, the cache grows as the source iterable progresses, so beware of
wrapping very large or infinite iterables. Supply *maxlen* to limit the
size of the cache (this of course limits how far back you can seek).

    >>> from itertools import count
    >>> it = seekable((str(n) for n in count()), maxlen=2)
    >>> next(it), next(it), next(it), next(it)
    ('0', '1', '2', '3')
    >>> list(it.elements())
    ['2', '3']
    >>> it.seek(0)
    >>> next(it), next(it), next(it), next(it)
    ('2', '3', '4', '5')
    >>> next(it)
    '6'

Nc