code: func (ns *Namespace) Intersect(l1, l2 interface{}) (interface{}, error) {
  	if l1 == nil || l2 == nil {
  		return make([]interface{}, 0), nil
  	}
  
  	var ins *intersector
  
  	l1v := reflect.ValueOf(l1)
  	l2v := reflect.ValueOf(l2)
  
  	switch l1v.Kind() {
  	case reflect.Array, reflect.Slice:
  		ins = &intersector{r: reflect.MakeSlice(l1v.Type(), 0, 0), seen: make(map[interface{}]bool)}
  		switch l2v.Kind() {
  		case reflect.Array, reflect.Slice:
  			for i := 0; i < l1v.Len(); i++ {
  				l1vv := l1v.Index(i)
  				if !l1vv.Type().Comparable() {
  					return make([]interface{}, 0), errors.New("intersect does not support slices or arrays of uncomparable types")
  				}
  
  				for j := 0; j < l2v.Len(); j++ {
  					l2vv := l2v.Index(j)
  					if !l2vv.Type().Comparable() {
  						return make([]interface{}, 0), errors.New("intersect does not support slices or arrays of uncomparable types")
  					}
  
  					ins.handleValuePair(l1vv, l2vv)
  				}
  			}
  			return ins.r.Interface(), nil
  		default:
  			return nil, errors.New("can't iterate over " + reflect.ValueOf(l2).Type().String())
  		}
  	default:
  		return nil, errors.New("can't iterate over " + reflect.ValueOf(l1).Type().String())
  	}
  }
docs: // Intersect returns the common elements in the given sets, l1 and l2.  l1 and
  // l2 must be of the same type and may be either arrays or slices.