Skip to content

Commit f3795e2

Browse files
committed
Fix and extend ControlFlow traverse_inorder example
1. The existing example compiles on its own, but any usage fails to be monomorphised and so doesn't compile. Fix that by using a mutable reference as an input argument. 2. Added an example usage of `traverse_inorder` showing how we can terminate the traversal early. Fixes #90063
1 parent 508fada commit f3795e2

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

library/core/src/ops/control_flow.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::{convert, ops};
2424
/// ```
2525
///
2626
/// A basic tree traversal:
27-
/// ```no_run
27+
/// ```
2828
/// use std::ops::ControlFlow;
2929
///
3030
/// pub struct TreeNode<T> {
@@ -34,7 +34,7 @@ use crate::{convert, ops};
3434
/// }
3535
///
3636
/// impl<T> TreeNode<T> {
37-
/// pub fn traverse_inorder<B>(&self, f: &impl Fn(&T) -> ControlFlow<B>) -> ControlFlow<B> {
37+
/// pub fn traverse_inorder<B>(&self, f: &mut impl FnMut(&T) -> ControlFlow<B>) -> ControlFlow<B> {
3838
/// if let Some(left) = &self.left {
3939
/// left.traverse_inorder(f)?;
4040
/// }
@@ -44,30 +44,32 @@ use crate::{convert, ops};
4444
/// }
4545
/// ControlFlow::Continue(())
4646
/// }
47+
/// fn leaf(value: T) -> Option<Box<TreeNode<T>>> {
48+
/// Some(Box::new(Self { value, left: None, right: None }))
49+
/// }
4750
/// }
4851
///
4952
/// let node = TreeNode {
5053
/// value: 0,
51-
/// left: Some(Box::new(TreeNode {
52-
/// value: 1,
53-
/// left: None,
54-
/// right: None
55-
/// })),
54+
/// left: TreeNode::leaf(1),
5655
/// right: Some(Box::new(TreeNode {
57-
/// value: 2,
58-
/// left: None,
59-
/// right: None
56+
/// value: -1,
57+
/// left: TreeNode::leaf(5),
58+
/// right: TreeNode::leaf(2),
6059
/// }))
6160
/// };
61+
/// let mut sum = 0;
6262
///
63-
/// node.traverse_inorder(& |val| {
64-
/// println!("{}", val);
65-
/// if *val <= 0 {
66-
/// ControlFlow::Break(())
63+
/// let res = node.traverse_inorder(&mut |val| {
64+
/// if *val < 0 {
65+
/// ControlFlow::Break(*val)
6766
/// } else {
67+
/// sum += *val;
6868
/// ControlFlow::Continue(())
6969
/// }
7070
/// });
71+
/// assert_eq!(res, ControlFlow::Break(-1));
72+
/// assert_eq!(sum, 6);
7173
/// ```
7274
#[stable(feature = "control_flow_enum_type", since = "1.55.0")]
7375
#[derive(Debug, Clone, Copy, PartialEq)]

0 commit comments

Comments
 (0)