code: func (t *Collection) EvictSomeItems() (numEvicted uint64) {
  	if t.store.readOnly {
  		return 0
  	}
  	i, err := t.store.walk(t, false, func(n *node) (*nodeLoc, bool) {
  		if !n.item.Loc().isEmpty() {
  			i := n.item.Item()
  			if i != nil && atomic.CompareAndSwapPointer(&n.item.item,
  				unsafe.Pointer(i), unsafe.Pointer(nil)) {
  				t.store.ItemDecRef(t, i)
  				numEvicted++
  			}
  		}
  		next := &n.left
  		if (rand.Int() & 0x01) == 0x01 {
  			next = &n.right
  		}
  		if next.isEmpty() {
  			return nil, false
  		}
  		return next, true
  	})
  	if i != nil && err != nil {
  		t.store.ItemDecRef(t, i)
  	}
  	return numEvicted
  }
docs: // Evict some clean items found by randomly walking a tree branch.
  // For concurrent users, only the single mutator thread should call
  // EvictSomeItems(), making it serialized with mutations.