|  | // 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 | 
|  | } |