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