"""Original class iterator scenarios for the pinned CPython 3.9.6 oracle."""
class Cursor:
    def __init__(self, start, stop):
        self.position = start
        self.stop = stop
        self.iterations = 0
        self.steps = 0
    def __iter__(self):
        self.iterations += 1
        return self
    def __next__(self):
        self.steps += 1
        if self.position >= self.stop:
            raise StopIteration('finished')
        value = self.position
        self.position += 1
        return value

cursor = Cursor(0, 4)
alias = iter(cursor)
print(alias is cursor, type(alias).__name__, isinstance(alias, Cursor), cursor.iterations)
print(next(cursor), next(alias), list(cursor), cursor.iterations, cursor.steps)
print(next(cursor, -1), next(alias, -1), cursor.steps)
print([value * 3 for value in Cursor(1, 4)])
print(sum(Cursor(0, 5)), min(Cursor(3, 7)), max(Cursor(3, 7)))
print(any(Cursor(0, 3)), all(Cursor(0, 3)), all(Cursor(1, 3)))
print(sorted(Cursor(1, 5), reverse=True))
print(list(filter(lambda value: value % 2, Cursor(0, 6))))
print(list(enumerate(Cursor(2, 5), 10)))
print(list(zip(Cursor(1, 4), Cursor(6, 8))))

class Source:
    def __init__(self):
        self.calls = 0
    def __iter__(self):
        self.calls += 1
        return iter('aé雪😀')
source = Source()
print(list(source), source.calls)
print(list(filter(bool, source)), source.calls)
print('雪' in source, 'z' not in source, source.calls)
generator = (value + 1 for value in Cursor(10, 13))
print(next(generator), list(generator))
