// Package stack implements a simple LIFO Stack for generic values package stack // Value is a generic value type Value interface{} // Stack contains generic values type Stack []Value // NewStack returns a new Stack func NewStack() Stack { return Stack{} } // Push adds value at tail func (s *Stack) Push(v Value) { *s = append(*s, v) } // Insert inserts value at head func (s *Stack) Insert(v Value) { *s = append(*s, 0) copy((*s)[1:], (*s)[:len(*s)-1]) (*s)[0] = v } // Pop retrieves value from tail func (s *Stack) Pop() (v Value) { if size := len(*s); size > 0 { v, *s = (*s)[size-1], (*s)[:size-1] } return v } // Peek returns top value from Stack func (s Stack) Peek() Value { return s[len(s)-1] } // Swap swapes two top values func (s Stack) Swap() { if size := len(s); size >= 2 { s[size-1], s[size-2] = s[size-2], s[size-1] } } // Depth returns actual size of Stack func (s Stack) Depth() int { return len(s) }