object_rainbow/
tuple_extra.rs1use crate::map_extra::{SmExtra, StaticMap};
2
3pub struct StaticToTuple0;
4
5impl<T> StaticMap<T> for StaticToTuple0 {
6 type Mapped = ();
7
8 fn static_map(_: T) -> Self::Mapped {}
9}
10
11pub type ToTuple0 = SmExtra<StaticToTuple0>;
12
13pub struct StaticToTuple2;
14
15impl<T: Clone> StaticMap<T> for StaticToTuple2 {
16 type Mapped = (T, T);
17
18 fn static_map(x: T) -> Self::Mapped {
19 (x.clone(), x)
20 }
21}
22
23pub type ToTuple2 = SmExtra<StaticToTuple2>;
24
25pub struct StaticExtra0;
26
27impl<A, B> StaticMap<(A, B)> for StaticExtra0 {
28 type Mapped = A;
29
30 fn static_map((a, _): (A, B)) -> Self::Mapped {
31 a
32 }
33}
34
35pub type Extra0 = SmExtra<StaticExtra0>;
36
37pub struct StaticExtra1;
38
39impl<A, B> StaticMap<(A, B)> for StaticExtra1 {
40 type Mapped = B;
41
42 fn static_map((_, b): (A, B)) -> Self::Mapped {
43 b
44 }
45}
46
47pub type Extra1 = SmExtra<StaticExtra1>;
48
49pub struct StaticSwap;
50
51impl<A, B> StaticMap<(A, B)> for StaticSwap {
52 type Mapped = (B, A);
53
54 fn static_map((a, b): (A, B)) -> Self::Mapped {
55 (b, a)
56 }
57}
58
59pub type Swap = SmExtra<StaticSwap>;
60
61pub struct StaticOneCrossN;
62
63impl<A: Clone, B, T: IntoIterator<Item = B>> StaticMap<(A, T)> for StaticOneCrossN {
64 type Mapped = Vec<(A, B)>;
65
66 fn static_map((a, b): (A, T)) -> Self::Mapped {
67 b.into_iter().map(|b| (a.clone(), b)).collect()
68 }
69}
70
71pub type OneCrossN = SmExtra<StaticOneCrossN>;
72
73#[allow(clippy::repr_packed_without_abi)]
74mod private {
75 use ghost::phantom;
76
77 #[phantom]
78 pub struct StaticMap1<M>;
79}
80#[doc(hidden)]
81pub use self::private::*;
82
83pub type StaticMap1<M> = private::StaticMap1<M>;
84
85impl<A, B, M: StaticMap<B>> StaticMap<(A, B)> for StaticMap1<M> {
86 type Mapped = (A, M::Mapped);
87
88 fn static_map((a, b): (A, B)) -> Self::Mapped {
89 (a, M::static_map(b))
90 }
91}
92
93pub type Map1<M> = SmExtra<StaticMap1<M>>;