summaryrefslogtreecommitdiffstats
path: root/test/typeparam/issue51303.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/typeparam/issue51303.go')
-rw-r--r--test/typeparam/issue51303.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/test/typeparam/issue51303.go b/test/typeparam/issue51303.go
new file mode 100644
index 0000000..a3a7849
--- /dev/null
+++ b/test/typeparam/issue51303.go
@@ -0,0 +1,65 @@
+// 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
+}