func::fail isolation

This commit is contained in:
AF 2023-06-18 11:43:26 +00:00
parent 25ede0db44
commit 6dfab12dbf
21 changed files with 47 additions and 29 deletions

View File

@ -1,3 +1,5 @@
use fail::*;
use crate::func::*;
type Frwa<'a, A, E0, E1, Fallible> =

View File

@ -1,4 +1,4 @@
use crate::flow::traversible::*;
use crate::{flow::traversible::*, func::class_prelude::MonadFail};
pub fn n_contains<'a, T: MonadFail<'a, ()>, A: 'a + Clone, D: 'a + PartialEq>(
comparator: &'a dyn Comparator<A>,

View File

@ -1,5 +1,6 @@
use crate::flow::comparator::*;
use crate::flow::traversible::*;
use crate::func::class_prelude::MonadFail;
fn and(_l: (), _r: ()) {}

View File

@ -8,11 +8,12 @@
//! * <https://hackage.haskell.org/package/base-4.18.0.0/docs/Control-Monad.html>
mod applicative_select;
pub mod class_prelude;
pub mod context;
mod controlflow;
pub mod derivations;
mod extensions;
mod fail;
pub mod fail;
pub mod instances;
pub mod shared;
#[cfg(test)]
@ -27,8 +28,7 @@ pub use self::applicative_select::{
};
use self::controlflow::{BindableMut, ControlFlowInstance};
pub use self::controlflow::{Iterative, IterativeWrapped};
pub use self::extensions::{MonadExt, MonadFailAnyExt};
pub use self::fail::{Fail, MonadFail, MonadFailAny, WrapE};
pub use self::extensions::MonadExt;
#[cfg(doc)]
use self::instances::stackless::StacklessInstance;

11
src/func/class_prelude.rs Normal file
View File

@ -0,0 +1,11 @@
pub use super::{
extensions::MonadExt,
fail::{Fail, MonadFail, MonadFailAny, MonadFailAnyExt, WrapE},
instances,
shared::{SharedFunctor, SharedFunctorAny},
Applicative, ApplicativeLA2, ApplicativeSelect, ApplicativeSelectExt, ApplicativeSeq,
ApplicativeTuple, ControlFlow, Functor, Iterative, IterativeWrapped, LocalFunctor, Monad, Pure,
Selected, SelectedWrapped, WeakFunctor, WeakFunctorAny, Wrap,
};
#[cfg(test)]
pub use super::{test_suite, tests};

View File

@ -1,4 +1,4 @@
use super::*;
use super::{fail::*, *};
pub type WrapC<'a, A, Ctx> = Wrap<'a, A, <Ctx as FunctorContext<'a>>::T>;

View File

@ -20,15 +20,3 @@ pub trait MonadExt<'a>: Monad<'a> {
Self::join(Self::la2(fa, fb, f))
}
}
pub trait MonadFailAnyExt<'a>: MonadFailAny<'a> {
fn pure<E: 'a, A: 'a>(a: A) -> WrapE<'a, A, E, Self> {
<Self::W<E> as Pure>::pure(a)
}
fn fail<E: 'a, A: 'a>(e: E) -> WrapE<'a, A, E, Self> {
<Self::W<E> as Fail<E>>::fail(e)
}
}
impl<'a, Fallible: ?Sized + MonadFailAny<'a>> MonadFailAnyExt<'a> for Fallible {}

View File

@ -84,3 +84,15 @@ pub trait MonadFailAny<'a>: 'a {
}
pub type WrapE<'a, A, E, Fallible> = Wrap<'a, A, <Fallible as MonadFailAny<'a>>::W<E>>;
pub trait MonadFailAnyExt<'a>: MonadFailAny<'a> {
fn pure<E: 'a, A: 'a>(a: A) -> WrapE<'a, A, E, Self> {
<Self::W<E> as Pure>::pure(a)
}
fn fail<E: 'a, A: 'a>(e: E) -> WrapE<'a, A, E, Self> {
<Self::W<E> as Fail<E>>::fail(e)
}
}
impl<'a, Fallible: ?Sized + MonadFailAny<'a>> MonadFailAnyExt<'a> for Fallible {}

View File

@ -21,7 +21,7 @@
//! [^research]: instances used for research purposes to enhance the abstract interfaces.
#[cfg(doc)]
use crate::func::*;
use crate::func::{fail::*, *};
pub mod composition;
pub mod effect;

View File

@ -4,9 +4,9 @@
//!
//! For [`future`]-[`result`] composition, see [`tryfuture`].
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
pub struct CompositionInstance<U, V>(U, V);

View File

@ -4,9 +4,9 @@
//!
//! For no extra data, see [`solo`].
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
/// Metadata type.
pub trait Effect {

View File

@ -12,9 +12,9 @@ use futures::{
join, FutureExt,
};
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
pub struct FutureInstance;

View File

@ -9,9 +9,9 @@
use std::{cell::RefCell, rc::Rc};
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
pub struct LazyInstance;

View File

@ -9,9 +9,9 @@
//!
//! For values that are never [`None`], see [`solo`].
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
#[derive(SharedFunctorAny)]
pub struct OptionInstance;

View File

@ -6,9 +6,9 @@
use std::marker::PhantomData;
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
pub struct OverloadInstance<T, O>(T, O);

View File

@ -9,9 +9,9 @@
//!
//! For values that are never [`Err`], see [`solo`].
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
#[derive(SharedFunctorAny)]
pub struct ResultInstance<E>(E);

View File

@ -4,9 +4,9 @@
//!
//! For abstracting away dealing with fallible data, see [`option`]/[`result`].
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
#[derive(SharedFunctorAny)]
pub struct SoloInstance;

View File

@ -5,10 +5,10 @@
use std::{cell::Cell, rc::Rc};
use crate::func::derivations::*;
use crate::func::class_prelude::*;
use crate::func::derivations::{ApplicativeLA2ViaSeq, ApplicativeTupleViaLA2};
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::*;
enum EvalTree<'a> {
Atom(Box<dyn 'a + FnOnce() -> Oet<'a>>),

View File

@ -11,9 +11,9 @@ use futures::{
try_join, FutureExt,
};
use crate::func::class_prelude::*;
#[cfg(doc)]
use crate::func::instances::*;
use crate::func::{shared::*, *};
pub struct TryFutureInstance<E>(E);

View File

@ -1,3 +1,5 @@
use fail::*;
use super::*;
/// Execution context.

View File

@ -1,5 +1,7 @@
//! Shorthands for using [`Context::Fallible`].
use fail::*;
use crate::func::context::*;
use super::*;