@@ -197,8 +197,60 @@ impl<B, C> ControlFlow<B, C> {
197
197
///
198
198
/// use std::ops::ControlFlow;
199
199
///
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));
202
254
/// ```
203
255
#[ inline]
204
256
#[ unstable( feature = "control_flow_ok" , issue = "140266" ) ]
@@ -250,8 +302,59 @@ impl<B, C> ControlFlow<B, C> {
250
302
///
251
303
/// use std::ops::ControlFlow;
252
304
///
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"));
255
358
/// ```
256
359
#[ inline]
257
360
#[ unstable( feature = "control_flow_ok" , issue = "140266" ) ]
0 commit comments