package arraylist

type Iterator struct {
	al     *ArrayList
	cur    uint
	isInit bool
}

func (iter *Iterator) Value() interface{} {
	v, _ := iter.al.Index((int)(iter.cur))
	return v
}

func (iter *Iterator) Prev() bool {

	if iter.isInit == false {
		if iter.al.size != 0 {
			iter.isInit = true
			iter.cur = iter.al.size - 1
			return true
		}
		return false
	}

	if iter.cur <= 0 {
		return false
	}
	iter.cur--
	return true
}

func (iter *Iterator) Next() bool {

	if iter.isInit == false {
		if iter.al.size != 0 {
			iter.isInit = true
			iter.cur = 0
			return true
		}
		return false
	}

	if iter.cur >= iter.al.size-1 {
		return false
	}
	iter.cur++
	return true
}

func (iter *Iterator) ToHead() {
	iter.isInit = true
	iter.cur = 0
}

func (iter *Iterator) ToTail() {
	iter.isInit = true
	iter.cur = iter.al.size - 1
}

type CircularIterator struct {
	al     *ArrayList
	cur    uint
	isInit bool
}

func (iter *CircularIterator) Value() interface{} {
	v, _ := iter.al.Index((int)(iter.cur))
	return v
}

func (iter *CircularIterator) Prev() bool {

	if iter.isInit == false {
		if iter.al.size != 0 {
			iter.isInit = true
			iter.cur = iter.al.size - 1
			return true
		}
		return false
	}

	if iter.al.size == 0 {
		return false
	}

	if iter.cur <= 0 {
		iter.cur = iter.al.size - 1
	} else {
		iter.cur--
	}
	return true
}

func (iter *CircularIterator) Next() bool {

	if iter.isInit == false {
		if iter.al.size != 0 {
			iter.isInit = true
			iter.cur = 0
			return true
		}
		return false
	}

	if iter.al.size == 0 {
		return false
	}

	if iter.cur >= iter.al.size-1 {
		iter.cur = 0
	} else {
		iter.cur++
	}
	return true
}

func (iter *CircularIterator) ToHead() {
	iter.isInit = true
	iter.cur = 0
}

func (iter *CircularIterator) ToTail() {
	iter.isInit = true
	iter.cur = iter.al.size - 1
}