@@ -177,8 +177,60 @@ impl<B, C> ControlFlow<B, C> {
177
177
///
178
178
/// use std::ops::ControlFlow;
179
179
///
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));
182
234
/// ```
183
235
#[ inline]
184
236
#[ unstable( feature = "control_flow_ok" , issue = "140266" ) ]
@@ -230,8 +282,59 @@ impl<B, C> ControlFlow<B, C> {
230
282
///
231
283
/// use std::ops::ControlFlow;
232
284
///
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"));
235
338
/// ```
236
339
#[ inline]
237
340
#[ unstable( feature = "control_flow_ok" , issue = "140266" ) ]
0 commit comments