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)
}
}
}