use crate::{Optics, OpticsTrait}; /// For lenses that allow viewing pub trait PrismPreview: OpticsTrait { type Field; fn preview(thing: T) -> Option; } pub trait PrismReview: PrismPreview { fn review(thing: Self::Field) -> T; } impl PrismPreview for Optics

where P: PrismPreview, { type Field = P::Field; fn preview(thing: T) -> Option { P::preview(thing) } } impl PrismReview for Optics

where P: PrismReview, { fn review(thing: Self::Field) -> T { P::review(thing) } } pub fn preview>(_prism: P, thing: T) -> Option { P::preview(thing) } pub fn review>(_prism: P, thing: P::Field) -> T { P::review(thing) } mod result; pub use result::{_Err, _Ok}; mod option; pub use option::{_None, _Some}; #[cfg(test)] mod tests { use super::*; #[test] fn preview_result() { let a: Result = Ok(3); assert_eq!(preview(_Ok, a), Some(3)); let a: Result = Err(3); assert_eq!(preview(_Ok, a), None); let a: Result = Ok(3); assert_eq!(preview(_Err, a), None); let a: Result = Err(3); assert_eq!(preview(_Err, a), Some(3)); } #[test] fn preview_option() { let a = Some(3); assert_eq!(preview(_Some, a), Some(3)); let a = Some(3); assert_eq!(preview(_None, a), Some(())); let a: Option = None; assert_eq!(preview(_Some, a), None); let a: Option = None; assert_eq!(preview(_None, a), Some(())); } #[test] fn review_result() { assert_eq!(review(_Ok, 3), Ok::(3)); assert_eq!(review(_Err, 3), Err::(3)); } #[test] fn review_option() { assert_eq!(review(_Some, 3), Some(3)); assert_eq!(review(_None, ()), None::<()>); } #[test] fn view_combination() {} }