fx_rs/core/
and.rs

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}