#![deny(unsafe_code)]
mod capture;
mod hash;
pub mod iter;
mod newtype;
mod peep;
pub mod slice;
mod string;
mod vec;
pub mod vec_map;
mod wrap;
pub use self::{
hash::HashMapExt,
peep::{PeekOption, Peep, PeepResult},
string::StringExt,
vec::VecExt,
wrap::Wrap,
};
#[macro_export]
macro_rules! try_res_opt {
($inner:expr) => {
match $inner {
::core::result::Result::Ok(::core::option::Option::Some(value)) => {
::core::result::Result::Ok(value)
}
::core::result::Result::Ok(::core::option::Option::None) => {
return ::core::result::Result::Ok(::core::option::Option::None)
}
::core::result::Result::Err(err) => return ::core::result::Result::Err(err),
}
};
($inner:expr,) => {
$crate::try_res_opt!($inner)
};
}
pub trait BoolExt: Copy {
fn some<T>(self, t: T) -> Option<T>;
fn some_with<T, F>(self, run: F) -> Option<T>
where
F: FnOnce() -> T;
fn as_option(self) -> Option<()>;
fn ok<T>(self, t: T) -> Result<T, ()>;
fn ok_with<T, F>(self, run: F) -> Result<T, ()>
where
F: FnOnce() -> T;
fn as_result(self) -> Result<(), ()>;
}
impl BoolExt for bool {
fn some<T>(self, t: T) -> Option<T> {
if self {
Some(t)
} else {
None
}
}
fn some_with<T, F>(self, run: F) -> Option<T>
where
F: FnOnce() -> T,
{
self.some(run())
}
fn as_option(self) -> Option<()> {
self.some(())
}
fn ok<T>(self, t: T) -> Result<T, ()> {
if self {
Ok(t)
} else {
Err(())
}
}
fn ok_with<T, F>(self, run: F) -> Result<T, ()>
where
F: FnOnce() -> T,
{
self.ok(run())
}
fn as_result(self) -> Result<(), ()> {
self.ok(())
}
}
pub trait IntoOption
where
Self: Sized,
{
fn some_if(self, predicate: bool) -> Option<Self> {
if predicate {
Some(self)
} else {
None
}
}
fn with_some_if<F>(self, predicate: F) -> Option<Self>
where
F: FnOnce(&Self) -> bool,
{
let res = predicate(&self);
self.some_if(res)
}
fn none_if(self, predicate: bool) -> Option<Self> {
if predicate {
None
} else {
Some(self)
}
}
fn with_none_if<F>(self, predicate: F) -> Option<Self>
where
F: FnOnce(&Self) -> bool,
{
let res = predicate(&self);
self.none_if(res)
}
}
impl<T> IntoOption for T {}
pub trait IntoResult
where
Self: Sized,
{
fn ok_if<E>(self, predicate: bool, err: E) -> Result<Self, E> {
if predicate {
Ok(self)
} else {
Err(err)
}
}
fn with_ok_if<F, E>(self, predicate: F, err: E) -> Result<Self, E>
where
F: FnOnce(&Self) -> bool,
{
let res = predicate(&self);
self.ok_if(res, err)
}
fn err_if<E>(self, predicate: bool, err: E) -> Result<Self, E> {
if predicate {
Err(err)
} else {
Ok(self)
}
}
fn with_err_if<F, E>(self, predicate: F, err: E) -> Result<Self, E>
where
F: FnOnce(&Self) -> bool,
{
let res = predicate(&self);
self.err_if(res, err)
}
}
impl<T> IntoResult for T {}
pub trait OptionExt {
type Item;
fn take_if<F>(&mut self, fun: F) -> Option<Self::Item>
where
F: FnOnce(&Self::Item) -> bool;
}
impl<T> OptionExt for Option<T> {
type Item = T;
fn take_if<F>(&mut self, fun: F) -> Option<Self::Item>
where
F: FnOnce(&Self::Item) -> bool,
{
if self.as_ref().map(fun).unwrap_or(false) {
self.take()
} else {
None
}
}
}
#[doc(hidden)]
pub mod lib {
pub use std::boxed::Box;
pub use std::collections::HashMap;
pub use std::fmt;
pub use std::string::String;
pub use std::sync::Arc;
pub use std::vec;
}