@@ -243,7 +243,7 @@ impl<'a, T: 'a> PartialEq for Edge<'a, T> {
243
243
/// Iterator which traverses a subtree.
244
244
#[ derive( Debug ) ]
245
245
pub struct Traverse < ' a , T : ' a > {
246
- root : NodeRef < ' a , T > ,
246
+ root : Option < NodeRef < ' a , T > > ,
247
247
edge : Option < Edge < ' a , T > > ,
248
248
}
249
249
impl < ' a , T : ' a > Clone for Traverse < ' a , T > {
@@ -254,12 +254,15 @@ impl<'a, T: 'a> Clone for Traverse<'a, T> {
254
254
}
255
255
}
256
256
}
257
+ impl < ' a , T : ' a > FusedIterator for Traverse < ' a , T > { }
257
258
impl < ' a , T : ' a > Iterator for Traverse < ' a , T > {
258
259
type Item = Edge < ' a , T > ;
259
260
fn next ( & mut self ) -> Option < Self :: Item > {
260
261
match self . edge {
261
262
None => {
262
- self . edge = Some ( Edge :: Open ( self . root ) ) ;
263
+ if let Some ( root) = self . root {
264
+ self . edge = Some ( Edge :: Open ( root) ) ;
265
+ }
263
266
}
264
267
Some ( Edge :: Open ( node) ) => {
265
268
if let Some ( first_child) = node. first_child ( ) {
@@ -269,7 +272,8 @@ impl<'a, T: 'a> Iterator for Traverse<'a, T> {
269
272
}
270
273
}
271
274
Some ( Edge :: Close ( node) ) => {
272
- if node == self . root {
275
+ if node == self . root . unwrap ( ) {
276
+ self . root = None ;
273
277
self . edge = None ;
274
278
} else if let Some ( next_sibling) = node. next_sibling ( ) {
275
279
self . edge = Some ( Edge :: Open ( next_sibling) ) ;
@@ -290,6 +294,7 @@ impl<'a, T: 'a> Clone for Descendants<'a, T> {
290
294
Descendants ( self . 0 . clone ( ) )
291
295
}
292
296
}
297
+ impl < ' a , T : ' a > FusedIterator for Descendants < ' a , T > { }
293
298
impl < ' a , T : ' a > Iterator for Descendants < ' a , T > {
294
299
type Item = NodeRef < ' a , T > ;
295
300
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -339,7 +344,7 @@ impl<'a, T: 'a> NodeRef<'a, T> {
339
344
/// Returns an iterator which traverses the subtree starting at this node.
340
345
pub fn traverse ( & self ) -> Traverse < ' a , T > {
341
346
Traverse {
342
- root : * self ,
347
+ root : Some ( * self ) ,
343
348
edge : None ,
344
349
}
345
350
}
0 commit comments