[no description]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use core::ops::Add;

use crate::{Pick, RePick, Tupl};

pub fn on<const N: usize, U, T: Tupl + Pick<N>>(
    mut f: impl FnMut(T::At) -> U,
) -> impl FnMut(T) -> U {
    move |x| f(x.pick())
}
pub fn at<const N: usize, U, T: Tupl + RePick<N, U>>(
    mut f: impl FnMut(T::At) -> U,
) -> impl FnMut(T) -> T::New {
    move |x| {
        let (l, a, r) = x.depict();
        T::unpick(l, f(a), r)
    }
}

pub mod r {
    use super::*;
    pub fn on<'a, const N: usize, U, T: Tupl<AsRef<'a>: Pick<N>> + 'a>(
        mut f: impl FnMut(<T::AsRef<'a> as Pick<N>>::At) -> U,
    ) -> impl FnMut(&'a T) -> U {
        move |x| f(x.as_ref().pick())
    }
    pub fn at<
        'a,
        const N: usize,
        U,
        T: Tupl<AsRef<'a>: RePick<N, U>> + 'a,
    >(
        mut f: impl FnMut(<T::AsRef<'a> as Pick<N>>::At) -> U,
    ) -> impl FnMut(&'a T) -> <T::AsRef<'a> as RePick<N, U>>::New {
        move |x| {
            let x = x.as_ref();
            let (l, a, r) = x.depict();
            <T::AsRef<'a>>::unpick(l, f(a), r)
        }
    }
}