fn_traits/fns/
control_flow_continue_value_fn.rs1use crate::{Fn, FnMut, FnOnce};
2use core::marker::PhantomData;
3use core::ops::ControlFlow;
4
5#[derive(Clone, Copy, Default)]
7pub struct ControlFlowContinueValueFn {
8 phantom: PhantomData<()>,
9}
10
11impl<B, C> FnOnce<(ControlFlow<B, C>,)> for ControlFlowContinueValueFn {
12 type Output = Option<C>;
13
14 fn call_once(self, args: (ControlFlow<B, C>,)) -> Self::Output {
15 match args.0 {
16 ControlFlow::Continue(value) => Some(value),
17 ControlFlow::Break(_) => None,
18 }
19 }
20}
21
22impl<B, C> FnMut<(ControlFlow<B, C>,)> for ControlFlowContinueValueFn {
23 type Output = Option<C>;
24
25 fn call_mut(&mut self, args: (ControlFlow<B, C>,)) -> Self::Output {
26 self.call_once(args)
27 }
28}
29
30impl<B, C> Fn<(ControlFlow<B, C>,)> for ControlFlowContinueValueFn {
31 type Output = Option<C>;
32
33 fn call(&self, args: (ControlFlow<B, C>,)) -> Self::Output {
34 self.call_once(args)
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::super::tests::{into_std_fn, into_std_fn_mut, into_std_fn_once};
41 use super::ControlFlowContinueValueFn;
42 use core::ops::ControlFlow;
43
44 #[test]
45 fn test_control_flow_break_value_fn() {
46 let f = ControlFlowContinueValueFn::default();
47
48 assert_eq!(
49 into_std_fn_once(Clone::clone(&f))(ControlFlow::<u32, u32>::Continue(2)),
50 Some(2)
51 );
52
53 assert_eq!(
54 into_std_fn_mut(Clone::clone(&f))(ControlFlow::<u32, u32>::Continue(2)),
55 Some(2)
56 );
57
58 assert_eq!(
59 into_std_fn(Clone::clone(&f))(ControlFlow::<u32, u32>::Continue(2)),
60 Some(2)
61 );
62
63 assert_eq!(
64 into_std_fn_once(Clone::clone(&f))(ControlFlow::<u32, u32>::Break(2)),
65 None
66 );
67 assert_eq!(
68 into_std_fn_mut(Clone::clone(&f))(ControlFlow::<u32, u32>::Break(2)),
69 None
70 );
71 assert_eq!(into_std_fn(Clone::clone(&f))(ControlFlow::<u32, u32>::Break(2)), None);
72 }
73}