Skip to main content

fn_traits/fns/
control_flow_break_value_fn.rs

1use crate::{Fn, FnMut, FnOnce};
2use core::marker::PhantomData;
3use core::ops::ControlFlow;
4
5/// [`ControlFlow::break_value`] function.
6#[derive(Clone, Copy, Default)]
7pub struct ControlFlowBreakValueFn {
8    phantom: PhantomData<()>,
9}
10
11impl<B, C> FnOnce<(ControlFlow<B, C>,)> for ControlFlowBreakValueFn {
12    type Output = Option<B>;
13
14    fn call_once(self, args: (ControlFlow<B, C>,)) -> Self::Output {
15        match args.0 {
16            ControlFlow::Continue(_) => None,
17            ControlFlow::Break(value) => Some(value),
18        }
19    }
20}
21
22impl<B, C> FnMut<(ControlFlow<B, C>,)> for ControlFlowBreakValueFn {
23    type Output = Option<B>;
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 ControlFlowBreakValueFn {
31    type Output = Option<B>;
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::ControlFlowBreakValueFn;
42    use core::ops::ControlFlow;
43
44    #[test]
45    fn test_control_flow_break_value_fn() {
46        let f = ControlFlowBreakValueFn::default();
47
48        assert_eq!(
49            into_std_fn_once(Clone::clone(&f))(ControlFlow::<u32, u32>::Break(2)),
50            Some(2)
51        );
52        assert_eq!(
53            into_std_fn_mut(Clone::clone(&f))(ControlFlow::<u32, u32>::Break(2)),
54            Some(2)
55        );
56        assert_eq!(
57            into_std_fn(Clone::clone(&f))(ControlFlow::<u32, u32>::Break(2)),
58            Some(2)
59        );
60
61        assert_eq!(
62            into_std_fn_once(Clone::clone(&f))(ControlFlow::<u32, u32>::Continue(2)),
63            None
64        );
65        assert_eq!(
66            into_std_fn_mut(Clone::clone(&f))(ControlFlow::<u32, u32>::Continue(2)),
67            None
68        );
69        assert_eq!(
70            into_std_fn(Clone::clone(&f))(ControlFlow::<u32, u32>::Continue(2)),
71            None
72        );
73    }
74}