code: func differenceArrayRun(a, b *Container) *Container {
  	statsHit("difference/ArrayRun")
  	// func (ac *arrayContainer) iandNotRun16(rc *runContainer16) container {
  
  	if a.n == 0 || b.n == 0 {
  		return a.Clone()
  	}
  
  	output := NewContainerArray(make([]uint16, 0, a.n))
  	// cardinality upper bound: card(A)
  
  	i := 0 // array index
  	j := 0 // run index
  	aa, rb := a.array(), b.runs()
  
  	// handle overlap
  	for i < int(a.n) {
  
  		// keep all array elements before beginning of runs
  		if aa[i] < rb[j].start {
  			output.add(aa[i])
  			i++
  			continue
  		}
  
  		// if array element in run, skip it
  		if aa[i] >= rb[j].start && aa[i] <= rb[j].last {
  			i++
  			continue
  		}
  
  		// if array element larger than current run, check next run
  		if aa[i] > rb[j].last {
  			j++
  			if j == len(rb) {
  				break
  			}
  		}
  	}
  
  	if i < len(aa) {
  		// keep all array elements after end of runs
  		// It's possible that output was converted from array to bitmap in output.add()
  		// so check container type before proceeding.
  		if output.typ == containerArray {
  			array := output.array()
  			array = append(array, aa[i:]...)
  			output.setArray(array)
  			// TODO: consider handling container.n mutations in one place
  			// like we do with container.add().
  			output.n += int32(len(aa[i:]))
  		} else {
  			for _, v := range aa[i:] {
  				output.add(v)
  			}
  		}
  	}
  	return output
  }
docs: // differenceArrayRun computes the difference of an array from a run.