pub(crate) trait ResultExt<T, E>: Sized {
fn then_err_into<U, E2: From<E>>(self, op: impl FnOnce(T) -> Result<U, E2>) -> Result<U, E2>;
}
pub(crate) trait FilterExt<T> {
fn filter(self, op: impl FnOnce(&T) -> bool) -> Self;
}
impl<T, E> FilterExt<T> for Result<T, E> {
fn filter(self, op: impl FnOnce(&T) -> bool) -> Self {
match self {
Ok(x) if op(&x) => Ok(x),
e => e,
}
}
}
impl<T> FilterExt<T> for Option<T> {
fn filter(self, op: impl FnOnce(&T) -> bool) -> Self {
match self {
Some(x) if op(&x) => Some(x),
v => v,
}
}
}
impl<T, E> ResultExt<T, E> for Result<T, E> {
fn then_err_into<U, E2: From<E>>(self, op: impl FnOnce(T) -> Result<U, E2>) -> Result<U, E2> {
op(self?)
}
}