Skip to main content

object_rainbow/
tuple_extra.rs

1use 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>>;