code: func (ns *Namespace) Complement(seqs ...interface{}) (interface{}, error) {
  	if len(seqs) < 2 {
  		return nil, errors.New("complement needs at least two arguments")
  	}
  
  	universe := seqs[len(seqs)-1]
  	as := seqs[:len(seqs)-1]
  
  	aset, err := collectIdentities(as...)
  	if err != nil {
  		return nil, err
  	}
  
  	v := reflect.ValueOf(universe)
  	switch v.Kind() {
  	case reflect.Array, reflect.Slice:
  		sl := reflect.MakeSlice(v.Type(), 0, 0)
  		for i := 0; i < v.Len(); i++ {
  			ev, _ := indirectInterface(v.Index(i))
  			if !ev.Type().Comparable() {
  				return nil, errors.New("elements in complement must be comparable")
  			}
  			if _, found := aset[normalize(ev)]; !found {
  				sl = reflect.Append(sl, ev)
  			}
  		}
  		return sl.Interface(), nil
  	default:
  		return nil, fmt.Errorf("arguments to complement must be slices or arrays")
  	}
  }
docs: // Complement gives the elements in the last element of seqs that are not in
  // any of the others.
  // All elements of seqs must be slices or arrays of comparable types.
  //
  // The reasoning behind this rather clumsy API is so we can do this in the templates:
  //    {{ $c := .Pages | complement $last4 }}