Skip to main content

fn_traits/fns/
control_flow_continue_value_fn.rs

1use crate::{Fn, FnMut, FnOnce};
2use core::marker::PhantomData;
3use core::ops::ControlFlow;
4
5/// [`ControlFlow::continue_value`] function.
6#[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}