1#[derive(Copy, Clone, Debug, PartialEq, Eq)]
2pub enum Some2<A, B> {
3 A(A),
4 B(B),
5 AB(A, B),
6}
7use Some2::*;
8
9impl<A, B> Some2<A, B> {
10 pub fn try_from_options(a: Option<A>, b: Option<B>) -> Option<Self> {
11 match (a, b) {
12 (None, None) => None,
13 (Some(a), None) => Some(A(a)),
14 (None, Some(b)) => Some(B(b)),
15 (Some(a), Some(b)) => Some(AB(a, b)),
16 }
17 }
18
19 pub fn as_ref(&self) -> Some2<&A, &B> {
20 match self {
21 A(a) => A(a),
22 B(b) => B(b),
23 AB(a, b) => AB(a, b),
24 }
25 }
26
27 pub fn a(self) -> Option<A> {
28 let (opta, _) = self.into();
29 opta
30 }
31
32 pub fn b(self) -> Option<B> {
33 let (_, optb) = self.into();
34 optb
35 }
36}
37
38impl<A, B> TryFrom<(Option<A>, Option<B>)> for Some2<A, B> {
39 type Error = &'static str;
40
41 fn try_from((opta, optb): (Option<A>, Option<B>)) -> Result<Self, Self::Error> {
42 Self::try_from_options(opta, optb).ok_or("no value of any accepted type present")
43 }
44}
45
46impl<A, B> From<(A, B)> for Some2<A, B> {
47 fn from((a, b): (A, B)) -> Self {
48 AB(a, b)
49 }
50}
51
52impl<A, B> From<Some2<A, B>> for (Option<A>, Option<B>) {
53 fn from(sp: Some2<A, B>) -> (Option<A>, Option<B>) {
54 match sp {
55 A(a) => (Some(a), None),
56 B(b) => (None, Some(b)),
57 AB(a, b) => (Some(a), Some(b)),
58 }
59 }
60}