code: func (c *Random) Put(b bgzf.Block) (evicted bgzf.Block, retained bool) {
  	c.mu.Lock()
  	defer c.mu.Unlock()
  
  	var d bgzf.Block
  	if _, ok := c.table[b.Base()]; ok {
  		return b, false
  	}
  	if len(c.table) == c.cap {
  		if !b.Used() {
  			return b, false
  		}
  		for k, v := range c.table {
  			if v.Used() {
  				continue
  			}
  			delete(c.table, k)
  			d = v
  			goto done
  		}
  		for k, v := range c.table {
  			delete(c.table, k)
  			d = v
  			break
  		}
  	done:
  	}
  	c.table[b.Base()] = b
  	return d, true
  }
docs: // Put inserts a Block into the Cache, returning the Block that was evicted or
  // nil if no eviction was necessary and the Block was retained. Unused Blocks
  // are not retained but are returned if the Cache is full.