From 0d91633f2b08b2110c2e4f32bb04924f4389f71b Mon Sep 17 00:00:00 2001 From: annieversary Date: Thu, 11 Nov 2021 21:54:00 +0000 Subject: [PATCH] add example --- examples/convoluted.rs | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 examples/convoluted.rs diff --git a/examples/convoluted.rs b/examples/convoluted.rs new file mode 100644 index 0000000..badcf1c --- /dev/null +++ b/examples/convoluted.rs @@ -0,0 +1,48 @@ +use bad_optics::{lenses::*, prisms::*, traversals::*}; + +#[derive(Debug, PartialEq, Clone)] +struct MyStruct { + hey: (u8, (u8, [Option; 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; 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", + ) + ); +}