fn_traits/fns/
control_flow_break_value_fn.rs1use crate::{Fn, FnMut, FnOnce};
2use core::marker::PhantomData;
3use core::ops::ControlFlow;
4
5#[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}