//! Trait BoolExt /// Boolean extensions and chain.starters pub trait BoolExt { fn and(self, t: Option) -> Option; #[must_use] fn and_is(self, b: bool) -> bool; #[must_use] fn and_if bool>(self, f: F) -> bool; fn and_then Option>(self, f: F) -> Option; #[must_use] fn clone_or(self, err: T, t: &T) -> T; #[must_use] fn copy_or(self, err: T, t: T) -> T; #[must_use] fn expect(self, msg: &str) -> Self; #[must_use] fn expect_false(self, msg: &str) -> Self; fn into_option(self) -> Option<()>; #[allow(clippy::result_unit_err)] fn into_result(self) -> Result<(), ()>; #[must_use] fn is_false(&self) -> Self; fn map T>(self, f: F) -> T where Self: Sized; fn map_ok_or T>(self, err: E, f: F) -> Result; fn map_or T>(self, err: T, f: F) -> T; fn map_or_else T, F: FnOnce() -> T>(self, err: E, f: F) -> T; fn ok_or(self, err: E) -> Result<(), E>; fn ok_or_else E>(self, err: F) -> Result<(), E>; fn or T>(self, f: F) -> Option; fn or_some(self, t: T) -> Option; fn then_none(self) -> Option; fn then_ok_or(self, t: T, e: E) -> Result; fn then_ok_or_else E>(self, t: T, e: F) -> Result; } impl BoolExt for bool { #[inline] fn and(self, t: Option) -> Option { self.then_some(t).flatten() } #[inline] fn and_if Self>(self, f: F) -> Self { self.and_is(f()) } #[inline] fn and_is(self, b: Self) -> Self { self && b } #[inline] fn and_then Option>(self, f: F) -> Option { self.then(f).flatten() } #[inline] fn clone_or(self, err: T, t: &T) -> T { self.map_or(err, || t.clone()) } #[inline] fn copy_or(self, err: T, t: T) -> T { self.map_or(err, || t) } #[inline] fn expect(self, msg: &str) -> Self { self.then_some(true).expect(msg) } #[inline] fn expect_false(self, msg: &str) -> Self { self.is_false().then_some(false).expect(msg) } #[inline] fn into_option(self) -> Option<()> { self.then_some(()) } #[inline] fn into_result(self) -> Result<(), ()> { self.ok_or(()) } #[inline] fn is_false(&self) -> Self { self.eq(&false) } #[inline] fn map T>(self, f: F) -> T where Self: Sized, { f(self) } #[inline] fn map_ok_or T>(self, err: E, f: F) -> Result { self.ok_or(err).map(|()| f()) } #[inline] fn map_or T>(self, err: T, f: F) -> T { self.then(f).unwrap_or(err) } #[inline] fn map_or_else T, F: FnOnce() -> T>(self, err: E, f: F) -> T { self.then(f).unwrap_or_else(err) } #[inline] fn ok_or(self, err: E) -> Result<(), E> { self.into_option().ok_or(err) } #[inline] fn ok_or_else E>(self, err: F) -> Result<(), E> { self.into_option().ok_or_else(err) } #[inline] fn or T>(self, f: F) -> Option { self.is_false().then(f) } #[inline] fn or_some(self, t: T) -> Option { self.is_false().then_some(t) } #[inline] fn then_none(self) -> Option { Option::::None } #[inline] fn then_ok_or(self, t: T, e: E) -> Result { self.map_ok_or(e, move || t) } #[inline] fn then_ok_or_else E>(self, t: T, e: F) -> Result { self.ok_or_else(e).map(move |()| t) } }