code: func (m *Matcher) run(begin, end uint64, buffer int, session *MatcherSession) chan *partialMatches {
  	// Create the source channel and feed section indexes into
  	source := make(chan *partialMatches, buffer)
  
  	session.pend.Add(1)
  	go func() {
  		defer session.pend.Done()
  		defer close(source)
  
  		for i := begin / m.sectionSize; i <= end/m.sectionSize; i++ {
  			select {
  			case <-session.quit:
  				return
  			case source <- &partialMatches{i, bytes.Repeat([]byte{0xff}, int(m.sectionSize/8))}:
  			}
  		}
  	}()
  	// Assemble the daisy-chained filtering pipeline
  	next := source
  	dist := make(chan *request, buffer)
  
  	for _, bloom := range m.filters {
  		next = m.subMatch(next, dist, bloom, session)
  	}
  	// Start the request distribution
  	session.pend.Add(1)
  	go m.distributor(dist, session)
  
  	return next
  }
docs: // run creates a daisy-chain of sub-matchers, one for the address set and one
  // for each topic set, each sub-matcher receiving a section only if the previous
  // ones have all found a potential match in one of the blocks of the section,
  // then binary AND-ing its own matches and forwarding the result to the next one.
  //
  // The method starts feeding the section indexes into the first sub-matcher on a
  // new goroutine and returns a sink channel receiving the results.