@@ -88,8 +88,9 @@ class DisjointSet[E]
88
88
# Get the root node of an element
89
89
# require: `has(e)`
90
90
private fun find (e :E ): DisjointSetNode
91
+ is
92
+ expects (nodes .has_key (e ))
91
93
do
92
- assert nodes .has_key (e )
93
94
var ne = nodes [e ]
94
95
if ne .parent == ne then return ne
95
96
var res = nfind (ne )
@@ -101,6 +102,8 @@ class DisjointSet[E]
101
102
# Use *path compression* to flatten the structure
102
103
# ENSURE: `result.parent == result`
103
104
private fun nfind (ne : DisjointSetNode ): DisjointSetNode
105
+ is
106
+ ensures (result .parent == result )
104
107
do
105
108
var nf = ne .parent
106
109
if nf == ne then return ne
@@ -126,7 +129,10 @@ class DisjointSet[E]
126
129
# Initially it is in its own disjoint subset
127
130
#
128
131
# ENSURE: `has(e)`
129
- redef fun add (e ) do
132
+ redef fun add (e )
133
+ is
134
+ ensures (self .has (e ))
135
+ do
130
136
if nodes .has_key (e ) then return
131
137
var ne = new DisjointSetNode
132
138
nodes [e ] = ne
@@ -199,6 +205,8 @@ class DisjointSet[E]
199
205
# Combine the subsets of `e` and `f`
200
206
# ENSURE: `in_same_subset(e,f)`
201
207
fun union (e ,f :E )
208
+ is
209
+ ensures (in_same_subset (e ,f ))
202
210
do
203
211
var ne = find (e )
204
212
var nf = find (f )
@@ -223,8 +231,10 @@ class DisjointSet[E]
223
231
end
224
232
225
233
# Combine the subsets of all elements of `es`
226
- # ENSURE: `all_in_same_subset(cs )`
234
+ # ENSURE: `all_in_same_subset(es )`
227
235
fun union_all (es :Collection [E ])
236
+ is
237
+ ensures (all_in_same_subset (es ))
228
238
do
229
239
if es .is_empty then return
230
240
var f = es .first
0 commit comments