36 lines
1.2 KiB
Rust
36 lines
1.2 KiB
Rust
//! Shorthands for using [`Context::Fallible`].
|
|
|
|
use fail::*;
|
|
|
|
use crate::func::context::*;
|
|
|
|
use super::*;
|
|
|
|
/// Preferred monad for fallible uses.
|
|
pub type FallibleMonad<'a, Ctx, E> = <<Ctx as Context<'a>>::Fallible as MonadFailAny<'a>>::W<E>;
|
|
|
|
/// Preferred [Wrapped] [Result].
|
|
pub type FallibleWrapped<'a, Ctx, A, E> = Wrap<'a, A, FallibleMonad<'a, Ctx, E>>;
|
|
|
|
/// Extention trait for simpler conversion between [`FunctorContext::T`] and [`Context::Fallible`].
|
|
///
|
|
/// Until either Rust type system or [`crate::func`] take serious changes,
|
|
/// this is the preferred way to switch between [Wrapped] and [fallible].
|
|
pub trait FallibleContext<'a>: Context<'a> {
|
|
/// Convert a fallible wrapped into a wrapped result.
|
|
fn unstuff<A: 'a, E: 'a>(
|
|
wa: WrapE<'a, A, E, <Self as Context<'a>>::Fallible>,
|
|
) -> WrapC<'a, Result<A, E>, Self> {
|
|
Self::Fallible::unstuff(wa)
|
|
}
|
|
|
|
/// Convert a wrapped result into a fallible wrapped.
|
|
fn stuff<A: 'a, E: 'a>(
|
|
fa: WrapC<'a, Result<A, E>, Self>,
|
|
) -> WrapE<'a, A, E, <Self as Context<'a>>::Fallible> {
|
|
Self::Fallible::stuff(fa)
|
|
}
|
|
}
|
|
|
|
impl<'a, Ctx: Context<'a>> FallibleContext<'a> for Ctx {}
|