#![allow(dead_code, deprecated, unused_variables, unused_mut)] #![feature(control_flow_ok)] use std::ops::ControlFlow; struct TreeNode { value: T, left: Option>>, right: Option>>, } impl TreeNode { fn find<'a>(&'a self, mut predicate: impl FnMut(&T) -> bool) -> Result<&'a T, ()> { let mut f = |t: &'a T| -> ControlFlow<&'a T> { if predicate(t) { ControlFlow::Break(t) } else { ControlFlow::Continue(()) } }; self.traverse_inorder(&mut f).break_ok() } fn traverse_inorder<'a, B>( &'a self, f: &mut impl FnMut(&'a T) -> ControlFlow, ) -> ControlFlow { if let Some(left) = &self.left { left.traverse_inorder(f)?; } f(&self.value)?; if let Some(right) = &self.right { right.traverse_inorder(f)?; } ControlFlow::Continue(()) } fn leaf(value: T) -> Option>> { Some( Box::new(Self { value, left: None, right: None, }), ) } } fn main() { let node = TreeNode { value: 0, left: TreeNode::leaf(1), right: Some( Box::new(TreeNode { value: -1, left: TreeNode::leaf(5), right: TreeNode::leaf(2), }), ), }; let res = node.find(|val: &i32| *val > 3); assert_eq!(res, Ok(& 5)); }