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