1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-03-05 15:16:07 +02:00
Tim Voronov 549b4abd3b
Feature/#5 collect keyword alt (#141)
Implemented COLLECT key word
2018-10-24 21:30:05 -04:00

50 lines
975 B
Go

package collections
import (
"github.com/MontFerret/ferret/pkg/runtime/values"
)
type KeyedIterator struct {
valVar string
keyVar string
values KeyedCollection
keys []string
pos int
}
func NewKeyedIterator(
valVar,
keyVar string,
input KeyedCollection,
) Iterator {
return &KeyedIterator{valVar, keyVar, input, nil, 0}
}
func NewDefaultKeyedIterator(input KeyedCollection) Iterator {
return NewKeyedIterator(DefaultValueVar, DefaultKeyVar, input)
}
func (iterator *KeyedIterator) HasNext() bool {
// lazy initialization
if iterator.keys == nil {
iterator.keys = iterator.values.Keys()
}
return len(iterator.keys) > iterator.pos
}
func (iterator *KeyedIterator) Next() (DataSet, error) {
if len(iterator.keys) > iterator.pos {
key := values.NewString(iterator.keys[iterator.pos])
val, _ := iterator.values.Get(key)
iterator.pos++
return DataSet{
iterator.valVar: val,
iterator.keyVar: key,
}, nil
}
return nil, ErrExhausted
}