gitlab.com/beacon-software/gadget@v0.0.0-20181217202115-54565ea1ed5e/collection/stringstack.go (about) 1 package collection 2 3 // StringStack is a stack for storing strings. 4 type StringStack interface { 5 // Size of the stack represented as a count of the elements in the stack. 6 Size() int 7 // Push a new data element onto the stack. 8 Push(data string) 9 // Pop the most recently pushed data element off the stack. 10 Pop() (string, error) 11 // Peek returns the most recently pushed element without modifying the stack 12 Peek() (string, error) 13 } 14 15 type stringStack struct { 16 stack Stack 17 } 18 19 // NewStringStack that is empty and ready to use. 20 func NewStringStack() StringStack { 21 return &stringStack{stack: NewStack()} 22 } 23 24 // NewStringStackFromStack allows for specifying the base of the string stack. 25 func NewStringStackFromStack(stack Stack) StringStack { 26 return &stringStack{stack: stack} 27 } 28 29 func (s *stringStack) Size() int { 30 return s.stack.Size() 31 } 32 33 func (s *stringStack) Push(data string) { 34 s.stack.Push(data) 35 } 36 37 func (s *stringStack) Pop() (string, error) { 38 return convert(s.stack.Pop) 39 } 40 41 func (s *stringStack) Peek() (string, error) { 42 return convert(s.stack.Peek) 43 } 44 45 func convert(call func() (interface{}, error)) (string, error) { 46 var data string 47 i, err := call() 48 if nil == err { 49 data = i.(string) 50 } 51 return data, err 52 }