Skip to content

Iterator lookahead and cached unread state [ref]

Problem

  • Implement repeated availability checks over [4, 5] without consuming a cached value.
  • Consume the first cached value, then obtain the second.
  • Check for a remaining value after consuming both.

Python solution

class Lookahead:
    def __init__(self, values):
        self.it = iter(values)
        self.ready = False
        self.value = None

    def has_next(self):
        if not self.ready:
            try:
                self.value = next(self.it)
            except StopIteration:
                return False
            self.ready = True
        return True

    def take(self):
        if not self.has_next():
            raise StopIteration
        self.ready = False
        return self.value

reader = Lookahead([4, 5])
(reader.has_next(), reader.has_next(), reader.value)  # (True, True, 4)

reader.take()     # 4
reader.has_next()  # True
reader.take()     # 5

reader.has_next()  # False