diff --git a/src/lenses/first.rs b/src/lenses/first.rs index b029304..a89fc74 100644 --- a/src/lenses/first.rs +++ b/src/lenses/first.rs @@ -12,10 +12,13 @@ macro_rules! make_tuples { } } impl< $($t,)* > LensOver<( $($t,)* )> for _0 { - fn over( + fn over( mut tup: ($($t,)*), - f: &dyn Fn(Self::Field) -> Self::Field - ) -> ( $($t,)* ) { + f: F + ) -> ( $($t,)* ) + where + F: FnOnce(Self::Field) -> Self::Field + { tup.0 = f(tup.0); tup } diff --git a/src/lenses/id.rs b/src/lenses/identity.rs similarity index 71% rename from src/lenses/id.rs rename to src/lenses/identity.rs index c8ef6e1..d90c02f 100644 --- a/src/lenses/id.rs +++ b/src/lenses/identity.rs @@ -11,7 +11,10 @@ impl LensView for T { } } impl LensOver for T { - fn over(thing: T, f: &dyn Fn(Self::Field) -> Self::Field) -> T { + fn over(thing: T, f: F) -> T + where + F: FnOnce(Self::Field) -> Self::Field, + { f(thing) } } diff --git a/src/lenses/mod.rs b/src/lenses/mod.rs index 509ae4a..8b1989a 100644 --- a/src/lenses/mod.rs +++ b/src/lenses/mod.rs @@ -1,4 +1,4 @@ -mod id; -pub use id::id; +mod identity; +pub use identity::id; mod first; pub use first::_0; diff --git a/src/lib.rs b/src/lib.rs index 92cb510..5e8faa1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,10 +5,12 @@ pub trait LensView { } pub trait LensOver: LensView { - fn over(thing: T, f: &dyn Fn(Self::Field) -> Self::Field) -> T; + fn over(thing: T, f: F) -> T + where + F: FnOnce(Self::Field) -> Self::Field; fn set(thing: T, v: Self::Field) -> T { - Self::over(thing, &|_| v) + Self::over(thing, |_| v) } } @@ -18,7 +20,7 @@ pub fn view>(_lens: L, thing: T) -> L::Field { pub fn set>(_lens: L, thing: T, v: L::Field) -> T { L::set(thing, v) } -pub fn over>(_lens: L, thing: T, f: &dyn Fn(L::Field) -> L::Field) -> T { +pub fn over>(_lens: L, thing: T, f: impl FnOnce(L::Field) -> L::Field) -> T { L::over(thing, f) }