tuples/
transpose.rs

1#![allow(deprecated)]
2//! Transposes
3
4/// Transposes
5pub trait TupleTranspose {
6    type OutTuple;
7
8    /// Transposes
9    fn transpose(self) -> Self::OutTuple;
10}
11
12impl TupleTranspose for Option<()> {
13    type OutTuple = ();
14
15    fn transpose(self) -> Self::OutTuple {
16        ()
17    }
18}
19
20impl TupleTranspose for () {
21    type OutTuple = Option<()>;
22
23    /// Always `None`
24    fn transpose(self) -> Self::OutTuple {
25        None
26    }
27}
28
29impl<T> TupleTranspose for Option<(T,)> {
30    type OutTuple = (Option<T>,);
31
32    fn transpose(self) -> Self::OutTuple {
33        match self {
34            Some(v) => (Some(v.0),),
35            None => (None,),
36        }
37    }
38}
39
40impl<T> TupleTranspose for (Option<T>,) {
41    type OutTuple = Option<(T,)>;
42
43    fn transpose(self) -> Self::OutTuple {
44        match self {
45            (Some(v),) => Some((v,)),
46            (None,) => None,
47        }
48    }
49}
50
51/// Transposes for Result
52pub trait TupleTransposeResult<Eo> {
53    type OutTuple;
54
55    /// Transposes for Result
56    #[deprecated = "use transpose1"]
57    fn transpose(self) -> Self::OutTuple;
58}
59
60impl<T, Eo: From<E>, E> TupleTransposeResult<Eo> for (Result<T, E>,) {
61    type OutTuple = Result<(T,), Eo>;
62
63    fn transpose(self) -> Self::OutTuple {
64        let (v0,) = self;
65        Ok((v0?,))
66    }
67}
68
69/// Transposes for Result
70pub trait TupleTransposeResultSameError {
71    type OutTuple;
72
73    /// Transposes for Result
74    fn transpose_same_error(self) -> Self::OutTuple;
75}
76
77impl<T, E> TupleTransposeResultSameError for (Result<T, E>,) {
78    type OutTuple = Result<(T,), E>;
79
80    fn transpose_same_error(self) -> Self::OutTuple {
81        let (v0,) = self;
82        Ok((v0?,))
83    }
84}
85
86/// Transposes for Result
87pub trait TupleTransposeResult1_1<E> {
88    type OutTuple<Eo>;
89
90    /// Transposes for Result
91    fn transpose1<Eo: From<E>>(self) -> Self::OutTuple<Eo>;
92}
93
94impl<T, E> TupleTransposeResult1_1<E> for (Result<T, E>,) {
95    type OutTuple<Eo> = Result<(T,), Eo>;
96
97    fn transpose1<Eo: From<E>>(self) -> Self::OutTuple<Eo> {
98        let (v0,) = self;
99        Ok((v0?,))
100    }
101}
102
103/// Transposes for Result
104pub trait TupleTransposeResultMapErr1<E> {
105    type OutTuple<Eo>;
106
107    /// Transposes for Result
108    fn transpose_map_err<Eo>(self, f: impl FnOnce(E) -> Eo) -> Self::OutTuple<Eo>;
109}
110
111impl<T, E> TupleTransposeResultMapErr1<E> for (Result<T, E>,) {
112    type OutTuple<Eo> = Result<(T,), Eo>;
113
114    fn transpose_map_err<Eo>(self, f: impl FnOnce(E) -> Eo) -> Self::OutTuple<Eo> {
115        let (v0,) = self;
116        Ok((match v0 {
117            Ok(v) => v,
118            Err(e) => Err(f(e))?,
119        },))
120    }
121}
122
123include!("./gen/transpose.rs");
124
125#[test]
126fn test() {
127    let a = Some((1, 2, 3)).transpose();
128    assert_eq!(a, (Some(1), Some(2), Some(3)));
129    let b = (Some(1), Some(2), Some(3)).transpose();
130    assert_eq!(b, Some((1, 2, 3)));
131}
132
133#[test]
134fn test_result() {
135    let a: (Result<u8, ()>, Result<u8, ()>, Result<u8, ()>) = (Ok(1), Ok(2), Ok(3));
136    let b: Result<(u8, u8, u8), ()> = a.transpose();
137    assert_eq!(b, Ok((1, 2, 3)));
138}
139
140#[test]
141fn test_result_2() {
142    let a: (Result<u8, i16>, Result<u8, i32>, Result<u8, i64>) = (Ok(1), Err(-1), Ok(3));
143    let b: Result<(u8, u8, u8), i64> = a.transpose();
144    assert_eq!(b, Err(-1));
145}
146
147#[test]
148fn test_result_same_error() {
149    let a: (Result<u8, i64>, Result<u8, i64>, Result<u8, i64>) = (Ok(1), Err(-1), Ok(3));
150    let b: Result<(u8, u8, u8), i64> = a.transpose_same_error();
151    assert_eq!(b, Err(-1));
152}
153
154#[test]
155fn test_result_same_error_2() {
156    let a: (Result<u8, ()>, Result<u8, ()>, Result<u8, ()>) = (Ok(1), Ok(2), Ok(3));
157    let b: Result<(u8, u8, u8), ()> = a.transpose_same_error();
158    assert_eq!(b, Ok((1, 2, 3)));
159}
160
161#[test]
162fn test_result_gat() {
163    let a: (Result<u8, ()>, Result<u8, ()>, Result<u8, ()>) = (Ok(1), Ok(2), Ok(3));
164    let b: Result<(u8, u8, u8), ()> = a.transpose1();
165    assert_eq!(b, Ok((1, 2, 3)));
166}
167
168#[test]
169fn test_result_gat_2() {
170    let a: (Result<u8, i16>, Result<u8, i32>, Result<u8, i64>) = (Ok(1), Err(-1), Ok(3));
171    let b: Result<(u8, u8, u8), i64> = a.transpose1();
172    assert_eq!(b, Err(-1));
173}
174
175#[test]
176fn test_result_gat_try() {
177    fn f() -> Result<(), i64> {
178        let a: (Result<u8, i16>, Result<u8, i32>, Result<u8, i64>) = (Ok(1), Err(-1), Ok(3));
179        a.transpose1::<i64>()?;
180        Ok(())
181    }
182    let b = f();
183    assert_eq!(b, Err(-1));
184}
185
186#[test]
187fn test_result_map_err() {
188    let a: (Result<u8, ()>, Result<u8, ()>, Result<u8, ()>) = (Ok(1), Ok(2), Ok(3));
189    let b: Result<(u8, u8, u8), ()> = a.transpose_map_err(|a| a, |a| a, |a| a);
190    assert_eq!(b, Ok((1, 2, 3)));
191}
192
193#[test]
194fn test_result_map_err_2() {
195    let a: (Result<u8, i16>, Result<u8, i32>, Result<u8, i64>) = (Ok(1), Err(-1), Ok(3));
196    let b: Result<(u8, u8, u8), i64> = a.transpose_map_err(|a| a.into(), |a| a.into(), |a| a.into());
197    assert_eq!(b, Err(-1));
198}