// run // Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import ( "fmt" ) func main() { x := [][]int{{1}} y := [][]int{{2, 3}} IntersectSS(x, y) } type list[E any] interface { ~[]E Equal(x, y E) bool } // ss is a set of sets type ss[E comparable, T []E] []T func (ss[E, T]) Equal(a, b T) bool { return SetEq(a, b) } func IntersectSS[E comparable](x, y [][]E) [][]E { return IntersectT[[]E, ss[E, []E]](ss[E, []E](x), ss[E, []E](y)) } func IntersectT[E any, L list[E]](x, y L) L { var z L outer: for _, xe := range x { fmt.Println("xe", xe) for _, ye := range y { fmt.Println("ye", ye) fmt.Println("x", x) if x.Equal(xe, ye) { fmt.Println("appending") z = append(z, xe) continue outer } } } return z } func SetEq[S []E, E comparable](x, y S) bool { fmt.Println("SetEq", x, y) outer: for _, xe := range x { for _, ye := range y { if xe == ye { continue outer } } return false // xs wasn't found in y } return true }