package concurrency

import (
	"errors"
	"sort"
)

// stack is an implementation of the stack data structure.
type stack struct {
	contents []*state
}

// IncreasingDepth is used to sort states in the increasing order of
// their depth.
type IncreasingDepth []*state

// SORT INTERFACE IMPLEMENTATION

func (states IncreasingDepth) Len() int {
	return len(states)
}
func (states IncreasingDepth) Less(i, j int) bool {
	return states[i].depth < states[j].depth
}
func (states IncreasingDepth) Swap(i, j int) {
	states[i], states[j] = states[j], states[i]
}

// Empty checks if the stack is empty.
func (s *stack) Empty() bool {
	return len(s.contents) == 0
}

// Length returns the length of the stack.
func (s *stack) Length() int {
	return len(s.contents)
}

// Pop removes and returns the top element of the stack. If the stack
// is empty, an error is returned.
func (s *stack) Pop() (*state, error) {
	l := len(s.contents)
	if l > 0 {
		x := s.contents[l-1]
		s.contents = s.contents[:l-1]
		return x, nil
	}
	return nil, errors.New("Stack is empty.")
}

// Push adds a new element to the top of the stack.
func (s *stack) Push(value *state) {
	s.contents = append(s.contents, value)
}

// Sort sorts the elements of the stack in the decreasing order of
// their depth.
func (s *stack) Sort() {
	sort.Sort(IncreasingDepth(s.contents))
}
