@@ -197,8 +197,60 @@ impl<B, C> ControlFlow<B, C> {
197197 ///
198198 /// use std::ops::ControlFlow;
199199 ///
200- /// assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").break_ok(), Ok("Stop right there!"));
201- /// assert_eq!(ControlFlow::<&str, i32>::Continue(3).break_ok(), Err(3));
200+ /// struct TreeNode<T> {
201+ /// value: T,
202+ /// left: Option<Box<TreeNode<T>>>,
203+ /// right: Option<Box<TreeNode<T>>>,
204+ /// }
205+ ///
206+ /// impl<T> TreeNode<T> {
207+ /// fn find<'a>(&'a self, mut predicate: impl FnMut(&T) -> bool) -> Result<&'a T, ()> {
208+ /// let mut f = |t: &'a T| -> ControlFlow<&'a T> {
209+ /// if predicate(t) {
210+ /// ControlFlow::Break(t)
211+ /// } else {
212+ /// ControlFlow::Continue(())
213+ /// }
214+ /// };
215+ ///
216+ /// self.traverse_inorder(&mut f).break_ok()
217+ /// }
218+ ///
219+ /// fn traverse_inorder<'a, B>(
220+ /// &'a self,
221+ /// f: &mut impl FnMut(&'a T) -> ControlFlow<B>,
222+ /// ) -> ControlFlow<B> {
223+ /// if let Some(left) = &self.left {
224+ /// left.traverse_inorder(f)?;
225+ /// }
226+ /// f(&self.value)?;
227+ /// if let Some(right) = &self.right {
228+ /// right.traverse_inorder(f)?;
229+ /// }
230+ /// ControlFlow::Continue(())
231+ /// }
232+ ///
233+ /// fn leaf(value: T) -> Option<Box<TreeNode<T>>> {
234+ /// Some(Box::new(Self {
235+ /// value,
236+ /// left: None,
237+ /// right: None,
238+ /// }))
239+ /// }
240+ /// }
241+ ///
242+ /// let node = TreeNode {
243+ /// value: 0,
244+ /// left: TreeNode::leaf(1),
245+ /// right: Some(Box::new(TreeNode {
246+ /// value: -1,
247+ /// left: TreeNode::leaf(5),
248+ /// right: TreeNode::leaf(2),
249+ /// })),
250+ /// };
251+ ///
252+ /// let res = node.find(|val: &i32| *val > 3);
253+ /// assert_eq!(res, Ok(&5));
202254 /// ```
203255 #[ inline]
204256 #[ unstable( feature = "control_flow_ok" , issue = "140266" ) ]
@@ -250,8 +302,59 @@ impl<B, C> ControlFlow<B, C> {
250302 ///
251303 /// use std::ops::ControlFlow;
252304 ///
253- /// assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").continue_ok(), Err("Stop right there!"));
254- /// assert_eq!(ControlFlow::<&str, i32>::Continue(3).continue_ok(), Ok(3));
305+ /// struct TreeNode<T> {
306+ /// value: T,
307+ /// left: Option<Box<TreeNode<T>>>,
308+ /// right: Option<Box<TreeNode<T>>>,
309+ /// }
310+ ///
311+ /// impl<T> TreeNode<T> {
312+ /// fn validate<B>(&self, f: &mut impl FnMut(&T) -> ControlFlow<B>) -> Result<(), B> {
313+ /// self.traverse_inorder(f).continue_ok()
314+ /// }
315+ ///
316+ /// fn traverse_inorder<B>(&self, f: &mut impl FnMut(&T) -> ControlFlow<B>) -> ControlFlow<B> {
317+ /// if let Some(left) = &self.left {
318+ /// left.traverse_inorder(f)?;
319+ /// }
320+ /// f(&self.value)?;
321+ /// if let Some(right) = &self.right {
322+ /// right.traverse_inorder(f)?;
323+ /// }
324+ /// ControlFlow::Continue(())
325+ /// }
326+ ///
327+ /// fn leaf(value: T) -> Option<Box<TreeNode<T>>> {
328+ /// Some(Box::new(Self {
329+ /// value,
330+ /// left: None,
331+ /// right: None,
332+ /// }))
333+ /// }
334+ /// }
335+ ///
336+ /// let node = TreeNode {
337+ /// value: 0,
338+ /// left: TreeNode::leaf(1),
339+ /// right: Some(Box::new(TreeNode {
340+ /// value: -1,
341+ /// left: TreeNode::leaf(5),
342+ /// right: TreeNode::leaf(2),
343+ /// })),
344+ /// };
345+ ///
346+ /// let res = node.validate(&mut |val| {
347+ /// if *val < 0 {
348+ /// return ControlFlow::Break("negative value detected");
349+ /// }
350+ ///
351+ /// if *val > 4 {
352+ /// return ControlFlow::Break("too big value detected");
353+ /// }
354+ ///
355+ /// ControlFlow::Continue(())
356+ /// });
357+ /// assert_eq!(res, Err("too big value detected"));
255358 /// ```
256359 #[ inline]
257360 #[ unstable( feature = "control_flow_ok" , issue = "140266" ) ]
0 commit comments