on master help sign in
Better behavior when unifying with yourself
20fa5f2Evan Czaplicki
src/Type/UnionFind.hs+17−16
@@ -133,25 +133,26 @@ union p1 p2 newDesc =
133 do point1@(Pt ref1) <- repr p1
133 do point1@(Pt ref1) <- repr p1
134 point2@(Pt ref2) <- repr p2
134 point2@(Pt ref2) <- repr p2
135
135
136− -- assert (point1 /= point2)
137−
138 Info w1 d1 <- readIORef ref1
136 Info w1 d1 <- readIORef ref1
139 Info w2 d2 <- readIORef ref2
137 Info w2 d2 <- readIORef ref2
140
138
139+ if point1 == point2
140+ then writeIORef d1 newDesc
141+ else do
141− weight1 <- readIORef w1
142+ weight1 <- readIORef w1
142− weight2 <- readIORef w2
143+ weight2 <- readIORef w2
143−
144+
144− let !newWeight = weight1 + weight2
145+ let !newWeight = weight1 + weight2
145−
146+
146− if weight1 >= weight2
147+ if weight1 >= weight2
147− then
148+ then
148− do writeIORef ref2 (Link point1)
149+ do writeIORef ref2 (Link point1)
149− writeIORef w1 newWeight
150+ writeIORef w1 newWeight
150− writeIORef d1 newDesc
151+ writeIORef d1 newDesc
151− else
152+ else
152− do writeIORef ref1 (Link point2)
153+ do writeIORef ref1 (Link point2)
153− writeIORef w2 newWeight
154+ writeIORef w2 newWeight
154− writeIORef d2 newDesc
155+ writeIORef d2 newDesc
155
156
156
157
157equivalent :: Point a -> Point a -> IO Bool
158equivalent :: Point a -> Point a -> IO Bool