Files
obitools4/pkg/obitax/iterator.go
2024-11-14 19:10:23 +01:00

94 lines
1.6 KiB
Go

package obitax
type ITaxon struct {
source chan *Taxon
current *Taxon
finished bool
p_finished *bool
}
func NewITaxon() *ITaxon {
i := ITaxon{
source: make(chan *Taxon),
current: nil,
finished: false,
p_finished: nil}
i.p_finished = &i.finished
return &i
}
func (set *TaxonSet) Iterator() *ITaxon {
i := NewITaxon()
go func() {
for _, t := range set.set {
i.source <- &Taxon{
Taxonomy: set.taxonomy,
Node: t,
}
}
close(i.source)
}()
return i
}
func (set *TaxonSlice) Iterator() *ITaxon {
i := NewITaxon()
go func() {
for _, t := range set.slice {
i.source <- &Taxon{
Taxonomy: set.taxonomy,
Node: t,
}
}
close(i.source)
}()
return i
}
func (taxonmy *Taxonomy) Iterator() *ITaxon {
return taxonmy.nodes.Iterator()
}
func (iterator *ITaxon) Next() bool {
if *(iterator.p_finished) {
return false
}
next, ok := (<-iterator.source)
if ok {
iterator.current = next
return true
}
iterator.current = nil
*iterator.p_finished = true
return false
}
// The 'Get' method returns the instance of *TaxNode
// currently pointed by the iterator. You have to use the
// 'Next' method to move to the next entry before calling
// 'Get' to retreive the following instance.
func (iterator *ITaxon) Get() *Taxon {
return iterator.current
}
// Finished returns 'true' value if no more data is available
// from the iterator.
func (iterator *ITaxon) Finished() bool {
return *iterator.p_finished
}
func (iterator *ITaxon) Split() *ITaxon {
return &ITaxon{
source: iterator.source,
current: nil,
finished: false,
p_finished: iterator.p_finished,
}
}