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
73mod private {
74 use ghost::phantom;
75
76 #[phantom]
77 pub struct StaticMap1<M>;
78}
79#[doc(hidden)]
80pub use self::private::*;
81
82pub type StaticMap1<M> = private::StaticMap1<M>;
83
84impl<A, B, M: StaticMap<B>> StaticMap<(A, B)> for StaticMap1<M> {
85 type Mapped = (A, M::Mapped);
86
87 fn static_map((a, b): (A, B)) -> Self::Mapped {
88 (a, M::static_map(b))
89 }
90}
91
92pub type Map1<M> = SmExtra<StaticMap1<M>>;