docs: def cb_filter(fastq, bc1, bc2, bc3, cores, nedit):
      ''' Filters reads with non-matching barcodes
      Expects formatted fastq files.
      '''
  
      with open_gzipsafe(bc1) as bc1_fh:
          bc1 = set(cb.strip() for cb in bc1_fh)
      if bc2:
          with open_gzipsafe(bc2) as bc2_fh:
              bc2 = set(cb.strip() for cb in bc2_fh)
      if bc3:
          with open_gzipsafe(bc3) as bc3_fh:
              bc3 = set(cb.strip() for cb in bc3_fh)
  
      annotations = detect_fastq_annotations(fastq)
      re_string = construct_transformed_regex(annotations)
  
      if nedit == 0:
          filter_cb = partial(exact_barcode_filter, bc1=bc1, bc2=bc2, bc3=bc3,
                              re_string=re_string)
      else:
          bc1hash = MutationHash(bc1, nedit)
          bc2hash = None
          bc3hash = None
          if bc2:
              bc2hash = MutationHash(bc2, nedit)
          if bc3:
              bc3hash = MutationHash(bc3, nedit)
          filter_cb = partial(correcting_barcode_filter, bc1hash=bc1hash,
                              bc2hash=bc2hash, bc3hash=bc3hash, re_string=re_string)
      p = multiprocessing.Pool(cores)
  
      chunks = tz.partition_all(10000, read_fastq(fastq))
      bigchunks = tz.partition_all(cores, chunks)
      for bigchunk in bigchunks:
          for chunk in p.map(filter_cb, list(bigchunk)):
              for read in chunk:
                  sys.stdout.write(read)