func (r Ring) ShiftN(count uint) (first, second Range, err error) {
	if count == 0 {
		return
	}
	first.Start, first.End, err = r.shiftN(count)
	if err != nil {
		return
	}
	if first.End <= first.Start && count > 0 {
		second.End = first.End
		first.End = r.capacity()
	}
	return
}
ShiftN bulk-"read"s count indexes from the start of the Ring and
returns ranges covering the indexes that were removed.

If the Ring holds only fewer elements as requested, ShiftN reads
nothing and returns ErrFull; the ranges returned in this case are
meaningless and have zero length.
package o
type Range struct {
	Start uint  
	End   uint  
}
func (r Range) Empty() bool {
	return r.Start == r.End
}
func (r Range) Length() uint {
	return r.End - r.Start
}
func (r Ring) Inspect() (first Range, second Range) {
	if r.Empty() {
		return
	}
	first.Start = r.start()
	end1 := r.end()
	first.End = end1
	if end1 <= first.Start {
		second.End = end1
		first.End = r.capacity()
	}
	return
}
func (r Ring) Consume() (first Range, second Range) {
	defer r.reset()
	return r.Inspect()
}
func (r Ring) PushN(count uint) (first, second Range, err error) {
	if count == 0 {
		return
	}
	first.Start = r.end()
	first.Start, first.End, err = r.pushN(count)
	if err != nil {
		return
	}
	if first.End <= first.Start && count > 0 {
		second.End = first.End
		first.End = r.capacity()
	}
	return
}