1
2
3
4
5 package p
6
7
8
9 func _() {
10 f(R1{})
11 }
12
13 func f[T any](R[T]) {}
14
15 type R[T any] interface {
16 m(R[T])
17 }
18
19 type R1 struct{}
20
21 func (R1) m(R[int]) {}
22
23
24
25 func _() {
26 r := newTestRules()
27 NewSet(r)
28 r2 := newTestRules2()
29 NewSet(r2)
30 }
31
32 type Set[T any] struct {
33 rules Rules[T]
34 }
35
36 func NewSet[T any](rules Rules[T]) Set[T] {
37 return Set[T]{
38 rules: rules,
39 }
40 }
41
42 func (s Set[T]) Copy() Set[T] {
43 return NewSet(s.rules)
44 }
45
46 type Rules[T any] interface {
47 Hash(T) int
48 Equivalent(T, T) bool
49 SameRules(Rules[T]) bool
50 }
51
52 type testRules struct{}
53
54 func newTestRules() Rules[int] {
55 return testRules{}
56 }
57
58 func (r testRules) Hash(val int) int {
59 return val % 16
60 }
61
62 func (r testRules) Equivalent(val1 int, val2 int) bool {
63 return val1 == val2
64 }
65
66 func (r testRules) SameRules(other Rules[int]) bool {
67 _, ok := other.(testRules)
68 return ok
69 }
70
71 type testRules2 struct{}
72
73 func newTestRules2() Rules[string] {
74 return testRules2{}
75 }
76
77 func (r testRules2) Hash(val string) int {
78 return 16
79 }
80
81 func (r testRules2) Equivalent(val1 string, val2 string) bool {
82 return val1 == val2
83 }
84
85 func (r testRules2) SameRules(other Rules[string]) bool {
86 _, ok := other.(testRules2)
87 return ok
88 }
89
View as plain text