// Package deque implements a deque using a circular array.
package deque

const (
	initialQueueSize = 4
)

// T is the type of queues.
type T struct {
	contents []interface{}

	// Boundary cases.
	// o If full, size==len and fx==bx
	// o If empty, size==0 and fx==bx
	// o On initialization, contents=nil, size==0, fx==bx.
	size int // Number of elements in the queue.
	fx   int // Index of the first element.
	bx   int // Index one past the last element (the index of the last element is (bx-1)%len).
}

// Size returns the number of items in the queue.
func (q *T) Size() int {
	return q.size
}

// Clear removes all the elements of the queue.
func (q *T) Clear() {
	q.fx = 0
	q.bx = 0
	q.size = 0
	q.contents = nil
}

// PushBack adds an element to the back of the queue.
func (q *T) PushBack(item interface{}) {
	q.reserve()
	q.contents[q.bx] = item
	q.bx = (q.bx + 1) % len(q.contents)
	q.size++
}

// PushFront adds an element to the front of the deque.
func (q *T) PushFront(item interface{}) {
	q.reserve()
	q.fx = (q.fx + len(q.contents) - 1) % len(q.contents)
	q.contents[q.fx] = item
	q.size++
}

// Front returns the first element of the deque, or nil if there is none.
func (q *T) Front() interface{} {
	if q.size == 0 {
		return nil
	}
	return q.contents[q.fx]
}

// Back returns the last element of the deque, or nil if there is none.
func (q *T) Back() interface{} {
	if q.size == 0 {
		return nil
	}
	return q.contents[(q.bx+len(q.contents)-1)%len(q.contents)]
}

// PopFront removes an element from the front of the queue and returns it.
func (q *T) PopFront() interface{} {
	if q.size == 0 {
		return nil
	}
	item := q.contents[q.fx]
	q.contents[q.fx] = nil
	q.fx = (q.fx + 1) % len(q.contents)
	q.size--
	return item
}

// PopBack removes an element from the front of the queue and returns it.
func (q *T) PopBack() interface{} {
	if q.size == 0 {
		return nil
	}
	q.bx = (q.bx + len(q.contents) - 1) % len(q.contents)
	item := q.contents[q.bx]
	q.contents[q.bx] = nil
	q.size--
	return item
}

// Iter iterates over the elements of the deque.  f should return false to
// terminate the iteration early.
func (q *T) Iter(f func(item interface{}) bool) {
	for i := 0; i != q.size; i++ {
		ix := (q.fx + i) % len(q.contents)
		if !f(q.contents[ix]) {
			break
		}
	}
}

// Reserve space for at least one additional element.
func (q *T) reserve() {
	if q.size == len(q.contents) {
		if q.contents == nil {
			q.contents = make([]interface{}, initialQueueSize)
			return
		}
		contents := make([]interface{}, q.size*2)
		i := copy(contents[:], q.contents[q.fx:])
		copy(contents[i:], q.contents[:q.fx])
		q.contents = contents
		q.fx = 0
		q.bx = q.size
	}
}
