Go iterators don’t have a built in way to send errors back, so I borrowed something from Haskell and made a “maybe” type:

type Maybe[T any] {
  Value T
  Err   error
}

func (m Maybe[T]) Get() (T, error) {
  return m.Value, m.Err
}

The iterator pushes values wrapped in this, which would have Value set if one is available, or Err set if not. The Get() method provides a convenient way to get both, allowing for patterns that look much like the following:

func consume() error {
  for m := range myIter() {
    val, err := m.Get()
    if err != nil {
      return err
    }
  }
  doThingWithVal(val)
}