@@ -376,6 +376,89 @@ impl<T> Default for Tree<T> {
376
376
}
377
377
}
378
378
379
+ impl < T : std:: fmt:: Debug > Tree < T > {
380
+ /// Write formatted tree representation and nodes with debug formatting.
381
+ ///
382
+ /// Example:
383
+ ///
384
+ /// ```
385
+ /// use slab_tree::tree::TreeBuilder;
386
+ ///
387
+ /// let mut tree = TreeBuilder::new().with_root(0).build();
388
+ /// let mut root = tree.root_mut().unwrap();
389
+ /// root.append(1)
390
+ /// .append(2);
391
+ /// root.append(3);
392
+ /// let mut s = String::new();
393
+ /// tree.write_formatted(&mut s).unwrap();
394
+ /// assert_eq!(&s, "\
395
+ /// 0
396
+ /// ├── 1
397
+ /// │ └── 2
398
+ /// └── 3
399
+ /// ");
400
+ /// ```
401
+ ///
402
+ /// Writes nothing if the tree is empty.
403
+ ///
404
+ /// ```
405
+ /// use slab_tree::tree::TreeBuilder;
406
+ ///
407
+ /// let tree = TreeBuilder::<i32>::new().build();
408
+ /// let mut s = String::new();
409
+ /// tree.write_formatted(&mut s).unwrap();
410
+ /// assert_eq!(&s, "");
411
+ /// ```
412
+ pub fn write_formatted < W : std:: fmt:: Write > ( & self , w : & mut W ) -> std:: fmt:: Result {
413
+ if let Some ( root) = self . root ( ) {
414
+ let node_id = root. node_id ( ) ;
415
+ let childn = 0 ;
416
+ let level = 0 ;
417
+ let last = vec ! [ ] ;
418
+ let mut stack = vec ! [ ( node_id, childn, level, last) ] ;
419
+ while let Some ( ( node_id, childn, level, last) ) = stack. pop ( ) {
420
+ debug_assert_eq ! (
421
+ last. len( ) ,
422
+ level,
423
+ "each previous level should indicate whether it has reached the last node"
424
+ ) ;
425
+ let node = self
426
+ . get ( node_id)
427
+ . expect ( "getting node of existing node ref id" ) ;
428
+ if childn == 0 {
429
+ for i in 1 ..level {
430
+ if last[ i - 1 ] {
431
+ write ! ( w, " " ) ?;
432
+ } else {
433
+ write ! ( w, "│ " ) ?;
434
+ }
435
+ }
436
+ if level > 0 {
437
+ if last[ level - 1 ] {
438
+ write ! ( w, "└── " ) ?;
439
+ } else {
440
+ write ! ( w, "├── " ) ?;
441
+ }
442
+ }
443
+ writeln ! ( w, "{:?}" , node. data( ) ) ?;
444
+ }
445
+ let mut children = node. children ( ) . skip ( childn) ;
446
+ if let Some ( child) = children. next ( ) {
447
+ let mut next_last = last. clone ( ) ;
448
+ if children. next ( ) . is_some ( ) {
449
+ stack. push ( ( node_id, childn + 1 , level, last) ) ;
450
+ next_last. push ( false ) ;
451
+ } else {
452
+ next_last. push ( true ) ;
453
+ }
454
+ stack. push ( ( child. node_id ( ) , 0 , level + 1 , next_last) ) ;
455
+ }
456
+ }
457
+ }
458
+ Ok ( ( ) )
459
+ }
460
+ }
461
+
379
462
#[ cfg_attr( tarpaulin, skip) ]
380
463
#[ cfg( test) ]
381
464
mod tree_tests {
0 commit comments