ring.go 592 B

1234567891011121314151617181920212223242526272829303132333435
  1. package collection
  2. type Ring struct {
  3. elements []interface{}
  4. index int
  5. }
  6. func NewRing(n int) *Ring {
  7. return &Ring{
  8. elements: make([]interface{}, n),
  9. }
  10. }
  11. func (r *Ring) Add(v interface{}) {
  12. r.elements[r.index%len(r.elements)] = v
  13. r.index++
  14. }
  15. func (r *Ring) Take() []interface{} {
  16. var size int
  17. var start int
  18. if r.index > len(r.elements) {
  19. size = len(r.elements)
  20. start = r.index % len(r.elements)
  21. } else {
  22. size = r.index
  23. }
  24. elements := make([]interface{}, size)
  25. for i := 0; i < size; i++ {
  26. elements[i] = r.elements[(start+i)%len(r.elements)]
  27. }
  28. return elements
  29. }