tpl/collections: Add collections.SymDiff

Fixes #5410
This commit is contained in:
Bjørn Erik Pedersen
2018-11-06 13:04:11 +01:00
parent b8b8436fcc
commit 488776b649
5 changed files with 204 additions and 18 deletions

View File

@@ -33,23 +33,9 @@ func (ns *Namespace) Complement(seqs ...interface{}) (interface{}, error) {
universe := seqs[len(seqs)-1]
as := seqs[:len(seqs)-1]
aset := make(map[interface{}]struct{})
for _, av := range as {
v := reflect.ValueOf(av)
switch v.Kind() {
case reflect.Array, reflect.Slice:
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")
}
aset[normalize(ev)] = struct{}{}
}
default:
return nil, fmt.Errorf("arguments to complement must be slices or arrays")
}
aset, err := collectIdentities(as...)
if err != nil {
return nil, err
}
v := reflect.ValueOf(universe)