1use crate::Fx;
2
3impl<'a, S: Clone, V: Clone> Fx<'a, S, V> {
4 pub fn and_nil(self) -> Fx<'a, (S, ()), V> {
5 self.contra_map(|(s, _)| s, |_, s| (s, ()))
6 }
7}
8
9impl<'a, S: Clone, V: Clone> Fx<'a, (S, S), V> {
10 pub fn and_collapse(self) -> Fx<'a, S, V> {
11 self.contra_map(|s: S| (s.clone(), s), |_, (_, s)| s)
12 }
13}
14
15impl<'a, S: Clone, B: Clone, V: Clone> Fx<'a, ((S, B), S), V> {
16 pub fn and_collapse_left(self) -> Fx<'a, (S, B), V> {
17 self.contra_map(|(s, b): (S, B)| ((s.clone(), b), s), |_, (sb, _)| sb)
18 }
19}
20
21impl<'a, A: Clone, B: Clone, C: Clone, V: Clone> Fx<'a, (A, (B, C)), V> {
22 pub fn and_rotate(self) -> Fx<'a, (C, (A, B)), V> {
23 self.contra_map(|(c, (a, b))| (a, (b, c)), |_, (a, (b, c))| (c, (a, b)))
24 }
25}
26
27impl<'a, A: Clone, B: Clone, V: Clone> Fx<'a, (A, B), V> {
28 pub fn and_swap(self) -> Fx<'a, (B, A), V> {
29 self.contra_map(|(b, a)| (a, b), |_, (a, b)| (b, a))
30 }
31
32 pub fn and_nest(self) -> Fx<'a, A, Fx<'a, B, V>> {
33 Fx::func(move |a: A| self.clone().provide_left(a))
34 }
35}
36
37impl<'a, A: Clone, B: Clone, V: Clone> Fx<'a, A, Fx<'a, B, V>> {
38 pub fn and_flat(self) -> Fx<'a, (A, B), V> {
39 self.flat_map(|v| v)
40 }
41}