1#![allow(deprecated)]
2pub trait TupleTranspose {
6 type OutTuple;
7
8 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 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
51pub trait TupleTransposeResult<Eo> {
53 type OutTuple;
54
55 #[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
69pub trait TupleTransposeResultSameError {
71 type OutTuple;
72
73 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
86pub trait TupleTransposeResult1_1<E> {
88 type OutTuple<Eo>;
89
90 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
103pub trait TupleTransposeResultMapErr1<E> {
105 type OutTuple<Eo>;
106
107 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}