Видимые варинаты: передавать 2 функции — peek (взять значение) и next (переместится к следующей позиции); передавать dotted pair — (value . next), value - текущее значение, next возвращает следующую пару.
Ещё думал над вариантом с продолжениями — сделать аналог yield корутинами, но боюсь, что будет тормозить, ибо хочется по максимуму оптимизировать скорость выборки.
Может есть какой то паттерн для таких случаев?