Source file
src/go/types/typeterm.go
1
2
3
4
5
6
7
8 package types
9
10
11
12
13
14
15
16 type term struct {
17 tilde bool
18 typ Type
19 }
20
21 func (x *term) String() string {
22 switch {
23 case x == nil:
24 return "β
"
25 case x.typ == nil:
26 return "π€"
27 case x.tilde:
28 return "~" + x.typ.String()
29 default:
30 return x.typ.String()
31 }
32 }
33
34
35 func (x *term) equal(y *term) bool {
36
37 switch {
38 case x == nil || y == nil:
39 return x == y
40 case x.typ == nil || y.typ == nil:
41 return x.typ == y.typ
42 }
43
44
45 return x.tilde == y.tilde && Identical(x.typ, y.typ)
46 }
47
48
49 func (x *term) union(y *term) (_, _ *term) {
50
51 switch {
52 case x == nil && y == nil:
53 return nil, nil
54 case x == nil:
55 return y, nil
56 case y == nil:
57 return x, nil
58 case x.typ == nil:
59 return x, nil
60 case y.typ == nil:
61 return y, nil
62 }
63
64
65 if x.disjoint(y) {
66 return x, y
67 }
68
69
70
71
72
73
74 if x.tilde || !y.tilde {
75 return x, nil
76 }
77 return y, nil
78 }
79
80
81 func (x *term) intersect(y *term) *term {
82
83 switch {
84 case x == nil || y == nil:
85 return nil
86 case x.typ == nil:
87 return y
88 case y.typ == nil:
89 return x
90 }
91
92
93 if x.disjoint(y) {
94 return nil
95 }
96
97
98
99
100
101
102 if !x.tilde || y.tilde {
103 return x
104 }
105 return y
106 }
107
108
109 func (x *term) includes(t Type) bool {
110
111 switch {
112 case x == nil:
113 return false
114 case x.typ == nil:
115 return true
116 }
117
118
119 u := t
120 if x.tilde {
121 u = under(u)
122 }
123 return Identical(x.typ, u)
124 }
125
126
127 func (x *term) subsetOf(y *term) bool {
128
129 switch {
130 case x == nil:
131 return true
132 case y == nil:
133 return false
134 case y.typ == nil:
135 return true
136 case x.typ == nil:
137 return false
138 }
139
140
141 if x.disjoint(y) {
142 return false
143 }
144
145
146
147
148
149
150 return !x.tilde || y.tilde
151 }
152
153
154
155 func (x *term) disjoint(y *term) bool {
156 if debug && (x.typ == nil || y.typ == nil) {
157 panic("invalid argument(s)")
158 }
159 ux := x.typ
160 if y.tilde {
161 ux = under(ux)
162 }
163 uy := y.typ
164 if x.tilde {
165 uy = under(uy)
166 }
167 return !Identical(ux, uy)
168 }
169
View as plain text