code: func (c *LRU) 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
  	}
  	used := b.Used()
  	if len(c.table) == c.cap {
  		if !used {
  			return b, false
  		}
  		d = c.root.prev.b
  		remove(c.root.prev, c.table)
  	}
  	n := &node{b: b}
  	c.table[b.Base()] = n
  	if used {
  		insertAfter(&c.root, n)
  	} else {
  		insertAfter(c.root.prev, n)
  	}
  	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.