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)
}