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