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}