============================================================
 ITERATORS & CUSTOM ITERABLES - Demo Run
============================================================

--- CountUp in a for-loop ---
  1   2   3   4   5 

--- Manual next() calls, observing StopIteration ---
  next() -> 1
  next() -> 2
  next() -> 3
  StopIteration raised -- iterator exhausted, as expected

--- Reusability: same CountUp instance iterated twice ---
  First pass:  [1, 2, 3]
  Second pass: [1, 2, 3]
  Both passes identical (proper reusable iterable): True

--- EvenNumbers ---
  [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

--- Fibonacci ---
  [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

--- Custom iterables with built-in functions ---
  sum(CountUp(1, 10)) = 55
  max(Fibonacci(10)) = 34
  list(EvenNumbers(1, 10)) = [2, 4, 6, 8, 10]

============================================================
 Assignment: ChunkedIterator
============================================================
  Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], chunk_size=3
    chunk: [1, 2, 3]
    chunk: [4, 5, 6]
    chunk: [7, 8, 9]
    chunk: [10]
  len(chunker) = 4  (ceiling division: 10 items / 3 = 4 chunks)
