code: func (bg *Reader) cacheSwap(base int64) bool {
  	bg.mu.RLock()
  	defer bg.mu.RUnlock()
  	if bg.cache == nil {
  		return false
  	}
  
  	blk, err := bg.cachedBlockFor(base)
  	if err != nil {
  		return false
  	}
  	if blk != nil {
  		// TODO(kortschak): Under some conditions, e.g. FIFO
  		// cache we will be discarding a non-nil evicted Block.
  		// Consider retaining these in a sync.Pool.
  		bg.cachePut(bg.current)
  		bg.current = blk
  		return true
  	}
  	var retained bool
  	bg.current, retained = bg.cachePut(bg.current)
  	if retained {
  		bg.current = nil
  	}
  	return false
  }
docs: // cacheSwap attempts to swap the current Block for a cached Block
  // for the given base offset. It returns true if successful.