package mdb type BTreeIterator[T any] struct { out chan *T close chan struct{} current *T } func newBTreeIterator[T any]() *BTreeIterator[T] { return &BTreeIterator[T]{ out: make(chan *T), close: make(chan struct{}, 1), } } func (iter *BTreeIterator[T]) each(i *T) bool { select { case iter.out <- i: return true case <-iter.close: return false } } func (iter *BTreeIterator[T]) done() { close(iter.out) } func (iter *BTreeIterator[T]) Next() bool { val, ok := <-iter.out if ok { iter.current = val return true } return false } func (iter *BTreeIterator[T]) Close() { iter.close <- struct{}{} } func (iter *BTreeIterator[T]) Value() T { return *iter.current }