2021-11-11 13:29:43 +00:00
|
|
|
use crate::lenses::{Lens, LensOver, LensView};
|
2021-11-05 10:12:03 +00:00
|
|
|
|
2021-11-05 14:22:59 +00:00
|
|
|
#[derive(Clone, Copy)]
|
2021-11-05 13:27:34 +00:00
|
|
|
pub struct _0Inner;
|
2021-11-11 13:29:43 +00:00
|
|
|
pub const _0: Lens<_0Inner> = Lens(_0Inner);
|
2021-11-05 10:12:03 +00:00
|
|
|
|
2021-11-05 11:03:17 +00:00
|
|
|
macro_rules! make_tuples {
|
2021-11-05 10:12:03 +00:00
|
|
|
($f:ident, ( $( $v:ident ),* ), ( $( $t:ident ),* ) ) => {
|
2021-11-05 13:27:34 +00:00
|
|
|
impl< $($t,)* > LensView<( $($t,)* )> for _0Inner {
|
2021-11-05 10:12:03 +00:00
|
|
|
type Field = T;
|
|
|
|
|
2021-11-11 10:39:47 +00:00
|
|
|
fn view(&self, ( $($v,)* ): ($($t,)*)) -> Self::Field {
|
2021-11-05 10:12:03 +00:00
|
|
|
$f
|
|
|
|
}
|
|
|
|
}
|
2021-11-11 10:39:47 +00:00
|
|
|
impl< $($t,)* > LensOver<( $($t,)* )> for _0Inner {
|
2021-11-05 12:05:55 +00:00
|
|
|
fn over<F>(
|
2021-11-11 10:39:47 +00:00
|
|
|
&self,
|
2021-11-05 10:12:03 +00:00
|
|
|
mut tup: ($($t,)*),
|
2021-11-05 12:05:55 +00:00
|
|
|
f: F
|
|
|
|
) -> ( $($t,)* )
|
|
|
|
where
|
|
|
|
F: FnOnce(Self::Field) -> Self::Field
|
|
|
|
{
|
2021-11-05 10:12:03 +00:00
|
|
|
tup.0 = f(tup.0);
|
|
|
|
tup
|
|
|
|
}
|
|
|
|
}
|
2021-11-05 11:03:17 +00:00
|
|
|
|
2021-11-11 10:39:47 +00:00
|
|
|
impl<'a, $($t,)* > LensView<&'a ( $($t,)* )> for _0Inner {
|
2021-11-05 10:12:03 +00:00
|
|
|
type Field = &'a T;
|
|
|
|
|
2021-11-11 10:39:47 +00:00
|
|
|
fn view(&self, ( $($v,)* ): &'a ($($t,)*)) -> Self::Field {
|
2021-11-05 10:12:03 +00:00
|
|
|
$f
|
|
|
|
}
|
|
|
|
}
|
2021-11-11 10:39:47 +00:00
|
|
|
impl<'a, $($t,)* > LensView<&'a mut ( $($t,)* )> for _0Inner {
|
2021-11-05 10:12:03 +00:00
|
|
|
type Field = &'a mut T;
|
|
|
|
|
2021-11-11 10:39:47 +00:00
|
|
|
fn view(&self, ( $($v,)* ): &'a mut ($($t,)*)) -> Self::Field {
|
2021-11-05 10:12:03 +00:00
|
|
|
$f
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2021-11-05 11:03:17 +00:00
|
|
|
make_tuples!(t, (t, _u), (T, U));
|
|
|
|
make_tuples!(t, (t, _u, _v), (T, U, V));
|
|
|
|
make_tuples!(t, (t, _u, _v, _w), (T, U, V, W));
|
|
|
|
make_tuples!(t, (t, _u, _v, _w, _x), (T, U, V, W, X));
|
|
|
|
make_tuples!(t, (t, _u, _v, _w, _x, _y), (T, U, V, W, X, Y));
|
|
|
|
make_tuples!(t, (t, _u, _v, _w, _x, _y, _z), (T, U, V, W, X, Y, Z));
|
2021-11-05 10:12:03 +00:00
|
|
|
// not doing more cause i'm lazy, open a pr if you need more :)
|
2021-11-05 12:09:20 +00:00
|
|
|
|
|
|
|
macro_rules! make_arrays {
|
|
|
|
($f:ident, $n:expr, [$( $v:ident ),*]) => {
|
2021-11-05 13:27:34 +00:00
|
|
|
impl<T> LensView<[T; $n]> for _0Inner {
|
2021-11-05 12:09:20 +00:00
|
|
|
type Field = T;
|
|
|
|
|
2021-11-11 10:39:47 +00:00
|
|
|
fn view(&self, [ $($v,)* ]: [T; $n]) -> Self::Field {
|
2021-11-05 12:09:20 +00:00
|
|
|
$f
|
|
|
|
}
|
|
|
|
}
|
2021-11-05 13:27:34 +00:00
|
|
|
impl<T> LensOver<[T; $n]> for _0Inner {
|
2021-11-05 12:09:20 +00:00
|
|
|
fn over<F>(
|
2021-11-11 10:39:47 +00:00
|
|
|
&self,
|
2021-11-05 12:09:20 +00:00
|
|
|
tup: [T; $n],
|
|
|
|
fun: F
|
|
|
|
) -> [T; $n]
|
|
|
|
where
|
|
|
|
F: FnOnce(Self::Field) -> Self::Field
|
|
|
|
{
|
|
|
|
let [$($v,)*] = tup;
|
|
|
|
let $f = fun( $f );
|
|
|
|
[$($v,)*]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-05 13:27:34 +00:00
|
|
|
impl<'a, T> LensView<&'a [T; $n]> for _0Inner {
|
2021-11-05 12:09:20 +00:00
|
|
|
type Field = &'a T;
|
|
|
|
|
2021-11-11 10:39:47 +00:00
|
|
|
fn view(&self, [ $($v,)* ]: &'a [T; $n]) -> Self::Field {
|
2021-11-05 12:09:20 +00:00
|
|
|
$f
|
|
|
|
}
|
|
|
|
}
|
2021-11-05 13:27:34 +00:00
|
|
|
impl<'a, T> LensView<&'a mut [T; $n]> for _0Inner {
|
2021-11-05 12:09:20 +00:00
|
|
|
type Field = &'a mut T;
|
|
|
|
|
2021-11-11 10:39:47 +00:00
|
|
|
fn view(&self, [ $($v,)* ]: &'a mut [T; $n]) -> Self::Field {
|
2021-11-05 12:09:20 +00:00
|
|
|
$f
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
make_arrays!(t, 1, [t]);
|
|
|
|
make_arrays!(t, 2, [t, _a]);
|
|
|
|
make_arrays!(t, 3, [t, _a, _b]);
|
|
|
|
make_arrays!(t, 4, [t, _a, _b, _c]);
|
|
|
|
make_arrays!(t, 5, [t, _a, _b, _c, _d]);
|
|
|
|
make_arrays!(t, 6, [t, _a, _b, _c, _d, _e]);
|
|
|
|
make_arrays!(t, 7, [t, _a, _b, _c, _d, _e, _g]);
|