 
     @_readTimeout = null # If set, the user called read() and we haven't called push() for it yet
 
+    unigramsOnly = true
+    for filter in @options.filters.include when filter.maxNgramSize > 1
+      unigramsOnly = false
+      break
+
+    @tokenListBuilder = if unigramsOnly
+      new UnigramTokenListBuilder(@options.filters.include, @options.filters.exclude)
+    else
+      new NgramTokenListBuilder(@options.filters.include, @options.filters.exclude)
+
     @nDocuments = 0
     @nDocumentsTotal = 1
-    @tokenBin = new TokenBin([])
 
   _start: ->
     @stream = oboe


  # Handles a single document's text
  _onDocumentText: (text) ->
    tokens = tokenize(text.toLowerCase())

    includeFilters = @options.filters.include
    excludeFilters = @options.filters.exclude

    toAdd = [] # list of all tokens, with repeats
    toAddSet = {} # token -> null. Ensure when we union we don't count tokens twice

    # Tokens aren't unigrams here, so there could be a crazy number of them. We
    # need to filter them before adding to the TokenBin.
    if includeFilters.length
      tokensString = tokens.join(' ')
      for filter, filterIndex in includeFilters
        moreToAdd = filter.findTokensFromUnigrams(tokensString)
        if toAdd.length
          # Remove duplicates: tokens we found in a previous filter
          moreToAdd = (token for token in moreToAdd when token not of toAddSet)
        if filterIndex < includeFilters.length - 1
          # Remember these tokens for the next filter
          (toAddSet[token] = null) for token in moreToAdd
        toAdd = toAdd.concat(moreToAdd)
    else
      toAdd = tokens

    for excludeFilter in excludeFilters
      newToAdd = (token for token in toAdd when !excludeFilter.test(token))
      toAdd = newToAdd

    @tokenBin.addTokens(toAdd)

    @nDocuments += 1

  _clearReadTimeout: ->

  #
  # Callers should call this when the client stops listening.
  destroy: ->
    @destroyed = true
    @stream?.abort() # It might be the case that @stream was never created

    @_clearReadTimeout() # No more reads, please
