prosper/stack.go

38 lines
854 B
Go

package main
import "fmt"
// ErrEmpty denotes an empty stack
var ErrEmpty = fmt.Errorf("stack empty")
// ErrUnderflow denotes a PICK that tried to pick a value that didn't exist
var ErrUnderflow = fmt.Errorf("cannot pick value from beyond stack depth")
// Stack is a stack of integers with no defined max depth
type Stack struct {
values []int
}
// Pop returns the top of the stack
func (s *Stack) Pop() (int, error) {
if len(s.values) == 0 {
return 0, ErrEmpty
}
i := s.values[0]
s.values = s.values[1:]
return i, nil
}
// Push adds a value to the top of the stack
func (s *Stack) Push(i int) {
s.values = append([]int{i}, s.values...)
}
// Pick grabs a value from the given depth in the stack, non-destructively.
func (s *Stack) Pick(i int) (int, error) {
if len(s.values) <= i {
return 0, ErrUnderflow
}
return s.values[i], nil
}