// Package stack implements a simple LIFO Stack for generic values package stack // Stack contains a generic value type Stack []interface{} // NewStack returns a new Stack func NewStack() Stack { return Stack{} } // Push generic value into Stack func (s *Stack) Push(v interface{}) { *s = append(*s, v) } // Pop generic value from Stack func (s *Stack) Pop() (v interface{}, ok bool) { size := len(*s) - 1 if ok = size >= 0; ok { v, *s = (*s)[size], (*s)[:size] } return v, ok } // Peek returns top value from Stack func (s *Stack) Peek() interface{} { return (*s)[len(*s) - 1] } // Depth returns actual size of Stack func (s *Stack) Depth() int { return len(*s) } // Swap swapes to top values func (s *Stack) Swap() { size := len(*s) if size >= 2 { (*s)[size-1], (*s)[size-2] = (*s)[size-2], (*s)[size-1] } }