pair_utils/
case.rs

1use crate::side::Side;
2use crate::pair::Pair;
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq)]
5pub enum Case<T> {
6    Both(Pair<T>),
7    One(Side, T),
8    None,
9}
10
11impl<T> From<[Option<T>; 2]> for Case<T> {
12    fn from(arr: [Option<T>; 2]) -> Self {
13        match arr {
14            [Some(left), Some(right)] => Self::Both([left, right].into()),
15            [Some(left), None] => Self::One(Side::L, left),
16            [None, Some(right)] => Self::One(Side::R, right),
17            [None, None] => Self::None,
18        }
19    }
20}
21
22impl<T> From<Case<T>> for [Option<T>; 2] { 
23    fn from(state: Case<T>) -> Self {
24        match state {
25            Case::Both(pair) => {
26                let [left, right]: [T; 2] = pair.into();
27                [Some(left), Some(right)]
28            },
29            Case::One(pair, value) => {
30                match pair {
31                    Side::L => [Some(value), None],
32                    Side::R => [None, Some(value)],
33                }
34            },
35            Case::None => [None, None],
36        }
37        
38    }
39}
40
41impl<T> From<Pair<Option<T>>> for Case<T> {
42    fn from(pair: Pair<Option<T>>) -> Self {
43        Into::<[Option<T>; 2]>::into(pair).into()
44    }
45}
46
47impl<T> From<Case<T>> for Pair<Option<T>> { 
48    fn from(state: Case<T>) -> Self {
49        Into::<[Option<T>; 2]>::into(state).into()
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn pair_none() {
59        let avail: Case<()> = [None, None].into();
60        assert_eq!(avail, Case::None);
61    }
62}