code: func New(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, broadcastBlock blockBroadcasterFn, chainHeight chainHeightFn, insertChain chainInsertFn, dropPeer peerDropFn) *Fetcher {
  	return &Fetcher{
  		notify:         make(chan *announce),
  		inject:         make(chan *inject),
  		headerFilter:   make(chan chan *headerFilterTask),
  		bodyFilter:     make(chan chan *bodyFilterTask),
  		done:           make(chan common.Hash),
  		quit:           make(chan struct{}),
  		announces:      make(map[string]int),
  		announced:      make(map[common.Hash][]*announce),
  		fetching:       make(map[common.Hash]*announce),
  		fetched:        make(map[common.Hash][]*announce),
  		completing:     make(map[common.Hash]*announce),
  		queue:          prque.New(nil),
  		queues:         make(map[string]int),
  		queued:         make(map[common.Hash]*inject),
  		getBlock:       getBlock,
  		verifyHeader:   verifyHeader,
  		broadcastBlock: broadcastBlock,
  		chainHeight:    chainHeight,
  		insertChain:    insertChain,
  		dropPeer:       dropPeer,
  	}
  }
docs: // New creates a block fetcher to retrieve blocks based on hash announcements.