package buffer

import "math"

// ListAt is a slice of BufferAt's, it's the backing for NewPartitionAt
type ListAt []BufferAt

// Len is the sum of the Len()'s of the BufferAt's in the list.
func (l *ListAt) Len() (n int64) {
	for _, buffer := range *l {
		if n > math.MaxInt64-buffer.Len() {
			return math.MaxInt64
		}
		n += buffer.Len()
	}
	return n
}

// Cap is the sum of the Cap()'s of the BufferAt's in the list.
func (l *ListAt) Cap() (n int64) {
	for _, buffer := range *l {
		if n > math.MaxInt64-buffer.Cap() {
			return math.MaxInt64
		}
		n += buffer.Cap()
	}
	return n
}

// Reset calls Reset() on each of the BufferAt's in the list.
func (l *ListAt) Reset() {
	for _, buffer := range *l {
		buffer.Reset()
	}
}

// Push adds a BufferAt to the end of the list
func (l *ListAt) Push(b BufferAt) {
	*l = append(*l, b)
}

// Pop removes and returns a BufferAt from the front of the list
func (l *ListAt) Pop() (b BufferAt) {
	b = (*l)[0]
	*l = (*l)[1:]
	return b
}