From f3795e27c1f4ab46626f17e027f54a96ab9ea77c Mon Sep 17 00:00:00 2001 From: Ilya Yanok Date: Sat, 23 Oct 2021 11:40:46 +0200 Subject: [PATCH] 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 --- library/core/src/ops/control_flow.rs | 30 +++++++++++++++------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/library/core/src/ops/control_flow.rs b/library/core/src/ops/control_flow.rs index ec00d0fe05b..776cea2ef79 100644 --- a/library/core/src/ops/control_flow.rs +++ b/library/core/src/ops/control_flow.rs @@ -24,7 +24,7 @@ use crate::{convert, ops}; /// ``` /// /// A basic tree traversal: -/// ```no_run +/// ``` /// use std::ops::ControlFlow; /// /// pub struct TreeNode { @@ -34,7 +34,7 @@ use crate::{convert, ops}; /// } /// /// impl TreeNode { -/// pub fn traverse_inorder(&self, f: &impl Fn(&T) -> ControlFlow) -> ControlFlow { +/// pub fn traverse_inorder(&self, f: &mut impl FnMut(&T) -> ControlFlow) -> ControlFlow { /// if let Some(left) = &self.left { /// left.traverse_inorder(f)?; /// } @@ -44,30 +44,32 @@ use crate::{convert, ops}; /// } /// ControlFlow::Continue(()) /// } +/// fn leaf(value: T) -> Option>> { +/// Some(Box::new(Self { value, left: None, right: None })) +/// } /// } /// /// let node = TreeNode { /// value: 0, -/// left: Some(Box::new(TreeNode { -/// value: 1, -/// left: None, -/// right: None -/// })), +/// left: TreeNode::leaf(1), /// right: Some(Box::new(TreeNode { -/// value: 2, -/// left: None, -/// right: None +/// value: -1, +/// left: TreeNode::leaf(5), +/// right: TreeNode::leaf(2), /// })) /// }; +/// let mut sum = 0; /// -/// node.traverse_inorder(& |val| { -/// println!("{}", val); -/// if *val <= 0 { -/// ControlFlow::Break(()) +/// let res = node.traverse_inorder(&mut |val| { +/// if *val < 0 { +/// ControlFlow::Break(*val) /// } else { +/// sum += *val; /// ControlFlow::Continue(()) /// } /// }); +/// assert_eq!(res, ControlFlow::Break(-1)); +/// assert_eq!(sum, 6); /// ``` #[stable(feature = "control_flow_enum_type", since = "1.55.0")] #[derive(Debug, Clone, Copy, PartialEq)]