package containers

type queueItem struct {
	val  interface{}
	next *queueItem
}

func NewQueue() *Queue {
	return new(Queue)
}

type Queue struct {
	start *queueItem
	top   *queueItem
	size  int
}

func (s *Queue) Size() int {
	return s.size
}

func (s *Queue) Push(val ...interface{}) {
	item := &queueItem{
		val: val[0],
	}
	if s.top != nil {
		s.top.next = item
	} else {
		s.start = item
	}
	s.top = item
	s.size++
	for i := 1; i < len(val); i++ {
		it := &queueItem{
			val: val[i],
		}
		item.next, item, s.top = it, it, it
		s.size++
	}
}

func (s *Queue) Pop() (val interface{}, check bool) {
	if s.start == nil {
		return
	}
	val, check = s.start.val, true
	s.start = s.start.next
	if s.start == nil {
		s.top = nil
	}
	s.size--
	return
}