code: func differenceRunArray(a, b *Container) *Container {
  	statsHit("difference/RunArray")
  	if a.n == 0 || b.n == 0 {
  		return a.Clone()
  	}
  	ra, ab := a.runs(), b.array()
  	runs := make([]interval16, 0, len(ra))
  
  	bidx := 0
  	vb := ab[bidx]
  
  RUNLOOP:
  	for _, run := range ra {
  		start := run.start
  		for vb < run.start {
  			bidx++
  			if bidx >= len(ab) {
  				break
  			}
  			vb = ab[bidx]
  		}
  		for vb >= run.start && vb <= run.last {
  			if vb == start {
  				if vb == 65535 { // overflow
  					break RUNLOOP
  				}
  				start++
  				bidx++
  				if bidx >= len(ab) {
  					break
  				}
  				vb = ab[bidx]
  				continue
  			}
  			runs = append(runs, interval16{start: start, last: vb - 1})
  			if vb == 65535 { // overflow
  				break RUNLOOP
  			}
  			start = vb + 1
  			bidx++
  			if bidx >= len(ab) {
  				break
  			}
  			vb = ab[bidx]
  		}
  
  		if start <= run.last {
  			runs = append(runs, interval16{start: start, last: run.last})
  		}
  	}
  	output := NewContainerRun(runs)
  	output.optimize()
  	return output
  }
docs: // differenceRunArray subtracts the bits in an array container from a run
  // container.