Compare commits

...

2 Commits

Author SHA1 Message Date
annieversary 16d7190a1d add field_lens! macro 2021-11-11 22:32:59 +00:00
annieversary 0d91633f2b add example 2021-11-11 22:32:45 +00:00
3 changed files with 74 additions and 0 deletions

48
examples/convoluted.rs Normal file
View File

@ -0,0 +1,48 @@
use bad_optics::{lenses::*, prisms::*, traversals::*};
#[derive(Debug, PartialEq, Clone)]
struct MyStruct {
hey: (u8, (u8, [Option<i32>; 5])),
}
fn main() {
// make a lens that accesses `hey` in `MyStruct`
let hey = lens(
|hello: MyStruct| hello.hey,
|mut hello: MyStruct, v| {
hello.hey = v;
hello
},
);
// the thing we want to access
let thing: (MyStruct, &'static str) = (
MyStruct {
hey: (1, (2, [None, Some(1), Some(2), None, Some(4)])),
},
"hello",
);
let array_lens = _0 // access the first element in the tuple
+ hey // access hey
+ _1 // access the second element in the tuple
+ _1; // access the second element in the tuple
assert_eq!(array_lens(thing.clone()).len(), 5);
let lens = array_lens
+ each // access each element of the [Option<i32>; 5] array
+ _Some; // access the ones that are Some;
assert_eq!(lens(thing.clone()), vec![1, 2, 4]);
assert_eq!(
lens(thing, |v| v + 10),
(
MyStruct {
hey: (1, (2, [None, Some(11), Some(12), None, Some(14)])),
},
"hello",
)
);
}

12
src/lenses/fields.rs Normal file
View File

@ -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
},
)
};
}

View File

@ -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