Just a forward-only cursor is required, not necessarily a rolling cursor. Not all
data sources can support rolling cursors, that's why forward-only cursors have been
chosen here as the least common denominator for the abstraction.
Rolling cursors cannot be emulated from an underlying forward-only cursor in a
(memory) efficient way. Result does not try to and will deliberately not keep
already yielded results in an internal cache.
To allow full (back and forth) iteration over the yielded results, a wrapping class
(i.e. Collection) may keep such a cache while draining the Result from outside.
Because of these characteristics an instance of Result may be used only once.
After draining the result it cannot be rewinded or reset. This is similar to the
behavior of the NoRewindIterator, where rewind calls have no effect.
The first result will be eager loaded from the cursor, as it is expected the
result will be used at least once.
The class also provides a mechanism which buffers results when peeking for next ones. The
buffered results will then be used when continuing to iterate over the result object.