| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package iter
- import "github.com/anacrolix/missinggo/slices"
- type Iterator interface {
- // Advances to the next value. Returns false if there are no more values.
- // Must be called before the first value.
- Next() bool
- // Returns the current value. Should panic when the iterator is in an
- // invalid state.
- Value() interface{}
- // Ceases iteration prematurely. This should occur implicitly if Next
- // returns false.
- Stop()
- }
- func ToFunc(it Iterator) Func {
- return func(cb Callback) {
- defer it.Stop()
- for it.Next() {
- if !cb(it.Value()) {
- break
- }
- }
- }
- }
- type sliceIterator struct {
- slice []interface{}
- value interface{}
- ok bool
- }
- func (me *sliceIterator) Next() bool {
- if len(me.slice) == 0 {
- return false
- }
- me.value = me.slice[0]
- me.slice = me.slice[1:]
- me.ok = true
- return true
- }
- func (me *sliceIterator) Value() interface{} {
- if !me.ok {
- panic("no value; call Next")
- }
- return me.value
- }
- func (me *sliceIterator) Stop() {}
- func Slice(a []interface{}) Iterator {
- return &sliceIterator{
- slice: a,
- }
- }
- func StringIterator(a string) Iterator {
- return Slice(slices.ToEmptyInterface(a))
- }
- func ToSlice(f Func) (ret []interface{}) {
- f(func(v interface{}) bool {
- ret = append(ret, v)
- return true
- })
- return
- }
|