// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.

// iterator.go
package expr

import "io"

type Iterator interface {
	Reset()
	Next() (item any, err error) // must return io.EOF after the last item
	Index() int
}

type FlatArrayIterator struct {
	a     []any
	index int
}

func NewFlatArrayIterator(array []any) *FlatArrayIterator {
	return &FlatArrayIterator{a: array, index: 0}
}

func (it *FlatArrayIterator) Reset() {
	it.index = 0
}

func (it *FlatArrayIterator) Next() (item any, err error) {
	if it.index < len(it.a) {
		item = it.a[it.index]
		it.index++
	} else {
		err = io.EOF
	}
	return
}

func (it *FlatArrayIterator) Index() int {
	return it.index - 1
}