From 508fadab16ec36c57daa8f0361db60848d31c0f7 Mon Sep 17 00:00:00 2001 From: Ilya Yanok Date: Sat, 23 Oct 2021 11:40:46 +0200 Subject: [PATCH] Update control_flow.rs Fix and extent 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 Fn trait instead of FnMut. 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 | 29 +++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/library/core/src/ops/control_flow.rs b/library/core/src/ops/control_flow.rs index cd2d57699c92..ec00d0fe05b9 100644 --- a/library/core/src/ops/control_flow.rs +++ b/library/core/src/ops/control_flow.rs @@ -34,17 +34,40 @@ /// } /// /// impl TreeNode { -/// pub fn traverse_inorder(&self, mut f: impl FnMut(&T) -> ControlFlow) -> ControlFlow { +/// pub fn traverse_inorder(&self, f: &impl Fn(&T) -> ControlFlow) -> ControlFlow { /// if let Some(left) = &self.left { -/// left.traverse_inorder(&mut f)?; +/// left.traverse_inorder(f)?; /// } /// f(&self.value)?; /// if let Some(right) = &self.right { -/// right.traverse_inorder(&mut f)?; +/// right.traverse_inorder(f)?; /// } /// ControlFlow::Continue(()) /// } /// } +/// +/// let node = TreeNode { +/// value: 0, +/// left: Some(Box::new(TreeNode { +/// value: 1, +/// left: None, +/// right: None +/// })), +/// right: Some(Box::new(TreeNode { +/// value: 2, +/// left: None, +/// right: None +/// })) +/// }; +/// +/// node.traverse_inorder(& |val| { +/// println!("{}", val); +/// if *val <= 0 { +/// ControlFlow::Break(()) +/// } else { +/// ControlFlow::Continue(()) +/// } +/// }); /// ``` #[stable(feature = "control_flow_enum_type", since = "1.55.0")] #[derive(Debug, Clone, Copy, PartialEq)]