From 4a1f398fe31c03fe370245baee7888a21b119472 Mon Sep 17 00:00:00 2001 From: annieversary Date: Mon, 15 Nov 2021 22:21:17 +0000 Subject: [PATCH] replace Box with Arc so lenses are clonable --- src/lenses/lens.rs | 11 +++++++---- src/lenses/to.rs | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/lenses/lens.rs b/src/lenses/lens.rs index ec8e647..a9f57f7 100644 --- a/src/lenses/lens.rs +++ b/src/lenses/lens.rs @@ -1,9 +1,12 @@ +use std::sync::Arc; + use crate::lenses::{Lens, LensOver, LensView}; type Getter = dyn Fn(T) -> U; type Setter = dyn Fn(T, U) -> T; -pub struct FuncLens(pub(crate) Box>, pub(crate) Box>); +#[derive(Clone)] +pub struct FuncLens(pub(crate) Arc>, pub(crate) Arc>); impl LensView for FuncLens { type Field = U; @@ -28,8 +31,8 @@ impl LensOver for FuncLens { /// Makes a lens that implements `LensView` and `LensOver` with the provided functions pub fn lens_from_boxed( - getter: Box>, - setter: Box>, + getter: Arc>, + setter: Arc>, ) -> Lens> { Lens(FuncLens(getter, setter)) } @@ -38,5 +41,5 @@ pub fn lens( getter: impl Fn(T) -> U + 'static, setter: impl Fn(T, U) -> T + 'static, ) -> Lens> { - Lens(FuncLens(Box::new(getter), Box::new(setter))) + Lens(FuncLens(Arc::new(getter), Arc::new(setter))) } diff --git a/src/lenses/to.rs b/src/lenses/to.rs index c6e9f24..36c1af2 100644 --- a/src/lenses/to.rs +++ b/src/lenses/to.rs @@ -1,8 +1,11 @@ +use std::sync::Arc; + use crate::lenses::{Lens, LensView}; use super::lens::FuncLens; -pub struct ToInner(Box U>); +#[derive(Clone)] +pub struct ToInner(Arc U>); impl LensView for ToInner { type Field = U; @@ -13,17 +16,17 @@ impl LensView for ToInner { } /// Makes a lens that implements `LensView` with the provided function -pub fn to_from_boxed(f: Box U>) -> Lens> { +pub fn to_from_boxed(f: Arc U>) -> Lens> { Lens(ToInner(f)) } /// Makes a lens that implements `LensView` with the provided function pub fn to(f: impl Fn(T) -> U + 'static) -> Lens> { - Lens(ToInner(Box::new(f))) + Lens(ToInner(Arc::new(f))) } impl Lens> { /// Makes a full lens that implements `LensView` and `LensOver` with the provided functions pub fn make_lens(self, setter: impl Fn(T, U) -> T + 'static) -> Lens> { - Lens(FuncLens((self.0).0, Box::new(setter))) + Lens(FuncLens((self.0).0, Arc::new(setter))) } }