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  }