From 16d7190a1de002475e0e0e9e817bc1e0e44cacc9 Mon Sep 17 00:00:00 2001 From: annieversary Date: Thu, 11 Nov 2021 22:32:59 +0000 Subject: [PATCH] add field_lens! macro --- src/lenses/fields.rs | 12 ++++++++++++ src/lenses/mod.rs | 14 ++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/lenses/fields.rs diff --git a/src/lenses/fields.rs b/src/lenses/fields.rs new file mode 100644 index 0000000..d3b38f6 --- /dev/null +++ b/src/lenses/fields.rs @@ -0,0 +1,12 @@ +#[macro_export] +macro_rules! field_lens { + ($type:ident, $field:ident) => { + lens( + |v: $type| v.$field, + |mut u: $type, v| { + u.$field = v; + u + }, + ) + }; +} diff --git a/src/lenses/mod.rs b/src/lenses/mod.rs index 60102af..e4161b6 100644 --- a/src/lenses/mod.rs +++ b/src/lenses/mod.rs @@ -1,3 +1,5 @@ +mod fields; + mod identity; pub use identity::id; @@ -164,6 +166,18 @@ mod tests { assert_eq!(l(hello), 8); } + #[test] + fn can_make_lens_for_field() { + // making a lens + let l = crate::field_lens!(Hello, hey); + + let hello = Hello { hey: 8 }; + assert_eq!(l(hello), 8); + + let hello = Hello { hey: 8 }; + assert_eq!(l(hello, |v| v + 1), Hello { hey: 9 }); + } + #[test] fn can_make_lens_out_of_funcs() { // making a lens