@@ -177,8 +177,60 @@ impl<B, C> ControlFlow<B, C> {
177177 ///
178178 /// use std::ops::ControlFlow;
179179 ///
180- /// assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").break_ok(), Ok("Stop right there!"));
181- /// assert_eq!(ControlFlow::<&str, i32>::Continue(3).break_ok(), Err(3));
180+ /// struct TreeNode<T> {
181+ /// value: T,
182+ /// left: Option<Box<TreeNode<T>>>,
183+ /// right: Option<Box<TreeNode<T>>>,
184+ /// }
185+ ///
186+ /// impl<T> TreeNode<T> {
187+ /// fn find<'a>(&'a self, mut predicate: impl FnMut(&T) -> bool) -> Result<&'a T, ()> {
188+ /// let mut f = |t: &'a T| -> ControlFlow<&'a T> {
189+ /// if predicate(t) {
190+ /// ControlFlow::Break(t)
191+ /// } else {
192+ /// ControlFlow::Continue(())
193+ /// }
194+ /// };
195+ ///
196+ /// self.traverse_inorder(&mut f).break_ok()
197+ /// }
198+ ///
199+ /// fn traverse_inorder<'a, B>(
200+ /// &'a self,
201+ /// f: &mut impl FnMut(&'a T) -> ControlFlow<B>,
202+ /// ) -> ControlFlow<B> {
203+ /// if let Some(left) = &self.left {
204+ /// left.traverse_inorder(f)?;
205+ /// }
206+ /// f(&self.value)?;
207+ /// if let Some(right) = &self.right {
208+ /// right.traverse_inorder(f)?;
209+ /// }
210+ /// ControlFlow::Continue(())
211+ /// }
212+ ///
213+ /// fn leaf(value: T) -> Option<Box<TreeNode<T>>> {
214+ /// Some(Box::new(Self {
215+ /// value,
216+ /// left: None,
217+ /// right: None,
218+ /// }))
219+ /// }
220+ /// }
221+ ///
222+ /// let node = TreeNode {
223+ /// value: 0,
224+ /// left: TreeNode::leaf(1),
225+ /// right: Some(Box::new(TreeNode {
226+ /// value: -1,
227+ /// left: TreeNode::leaf(5),
228+ /// right: TreeNode::leaf(2),
229+ /// })),
230+ /// };
231+ ///
232+ /// let res = node.find(|val: &i32| *val > 3);
233+ /// assert_eq!(res, Ok(&5));
182234 /// ```
183235 #[ inline]
184236 #[ unstable( feature = "control_flow_ok" , issue = "140266" ) ]
@@ -230,8 +282,59 @@ impl<B, C> ControlFlow<B, C> {
230282 ///
231283 /// use std::ops::ControlFlow;
232284 ///
233- /// assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").continue_ok(), Err("Stop right there!"));
234- /// assert_eq!(ControlFlow::<&str, i32>::Continue(3).continue_ok(), Ok(3));
285+ /// struct TreeNode<T> {
286+ /// value: T,
287+ /// left: Option<Box<TreeNode<T>>>,
288+ /// right: Option<Box<TreeNode<T>>>,
289+ /// }
290+ ///
291+ /// impl<T> TreeNode<T> {
292+ /// fn validate<B>(&self, f: &mut impl FnMut(&T) -> ControlFlow<B>) -> Result<(), B> {
293+ /// self.traverse_inorder(f).continue_ok()
294+ /// }
295+ ///
296+ /// fn traverse_inorder<B>(&self, f: &mut impl FnMut(&T) -> ControlFlow<B>) -> ControlFlow<B> {
297+ /// if let Some(left) = &self.left {
298+ /// left.traverse_inorder(f)?;
299+ /// }
300+ /// f(&self.value)?;
301+ /// if let Some(right) = &self.right {
302+ /// right.traverse_inorder(f)?;
303+ /// }
304+ /// ControlFlow::Continue(())
305+ /// }
306+ ///
307+ /// fn leaf(value: T) -> Option<Box<TreeNode<T>>> {
308+ /// Some(Box::new(Self {
309+ /// value,
310+ /// left: None,
311+ /// right: None,
312+ /// }))
313+ /// }
314+ /// }
315+ ///
316+ /// let node = TreeNode {
317+ /// value: 0,
318+ /// left: TreeNode::leaf(1),
319+ /// right: Some(Box::new(TreeNode {
320+ /// value: -1,
321+ /// left: TreeNode::leaf(5),
322+ /// right: TreeNode::leaf(2),
323+ /// })),
324+ /// };
325+ ///
326+ /// let res = node.validate(&mut |val| {
327+ /// if *val < 0 {
328+ /// return ControlFlow::Break("negative value detected");
329+ /// }
330+ ///
331+ /// if *val > 4 {
332+ /// return ControlFlow::Break("too big value detected");
333+ /// }
334+ ///
335+ /// ControlFlow::Continue(())
336+ /// });
337+ /// assert_eq!(res, Err("too big value detected"));
235338 /// ```
236339 #[ inline]
237340 #[ unstable( feature = "control_flow_ok" , issue = "140266" ) ]
0 commit comments