diff --git a/src/flow/speculative.rs b/src/flow/speculative.rs index 37e42dc..9dd1586 100644 --- a/src/flow/speculative.rs +++ b/src/flow/speculative.rs @@ -1,3 +1,5 @@ +use fail::*; + use crate::func::*; type Frwa<'a, A, E0, E1, Fallible> = diff --git a/src/flow/traversible/algorithms/contains.rs b/src/flow/traversible/algorithms/contains.rs index c5b04c6..ab696c1 100644 --- a/src/flow/traversible/algorithms/contains.rs +++ b/src/flow/traversible/algorithms/contains.rs @@ -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, diff --git a/src/flow/traversible/algorithms/subset.rs b/src/flow/traversible/algorithms/subset.rs index 6d10333..55b6448 100644 --- a/src/flow/traversible/algorithms/subset.rs +++ b/src/flow/traversible/algorithms/subset.rs @@ -1,5 +1,6 @@ use crate::flow::comparator::*; use crate::flow::traversible::*; +use crate::func::class_prelude::MonadFail; fn and(_l: (), _r: ()) {} diff --git a/src/func.rs b/src/func.rs index f386cf5..6cccc9a 100644 --- a/src/func.rs +++ b/src/func.rs @@ -8,11 +8,12 @@ //! * 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; diff --git a/src/func/class_prelude.rs b/src/func/class_prelude.rs new file mode 100644 index 0000000..24edd46 --- /dev/null +++ b/src/func/class_prelude.rs @@ -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}; diff --git a/src/func/context.rs b/src/func/context.rs index f3f58f0..ef74a95 100644 --- a/src/func/context.rs +++ b/src/func/context.rs @@ -1,4 +1,4 @@ -use super::*; +use super::{fail::*, *}; pub type WrapC<'a, A, Ctx> = Wrap<'a, A, >::T>; diff --git a/src/func/extensions.rs b/src/func/extensions.rs index 0e2e7e8..e7f18cb 100644 --- a/src/func/extensions.rs +++ b/src/func/extensions.rs @@ -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(a: A) -> WrapE<'a, A, E, Self> { - as Pure>::pure(a) - } - - fn fail(e: E) -> WrapE<'a, A, E, Self> { - as Fail>::fail(e) - } -} - -impl<'a, Fallible: ?Sized + MonadFailAny<'a>> MonadFailAnyExt<'a> for Fallible {} diff --git a/src/func/fail.rs b/src/func/fail.rs index fd75f4c..8280cfe 100644 --- a/src/func/fail.rs +++ b/src/func/fail.rs @@ -84,3 +84,15 @@ pub trait MonadFailAny<'a>: 'a { } pub type WrapE<'a, A, E, Fallible> = Wrap<'a, A, >::W>; + +pub trait MonadFailAnyExt<'a>: MonadFailAny<'a> { + fn pure(a: A) -> WrapE<'a, A, E, Self> { + as Pure>::pure(a) + } + + fn fail(e: E) -> WrapE<'a, A, E, Self> { + as Fail>::fail(e) + } +} + +impl<'a, Fallible: ?Sized + MonadFailAny<'a>> MonadFailAnyExt<'a> for Fallible {} diff --git a/src/func/instances.rs b/src/func/instances.rs index 6169f7c..8240891 100644 --- a/src/func/instances.rs +++ b/src/func/instances.rs @@ -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; diff --git a/src/func/instances/composition.rs b/src/func/instances/composition.rs index fd52493..25a9666 100644 --- a/src/func/instances/composition.rs +++ b/src/func/instances/composition.rs @@ -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); diff --git a/src/func/instances/effect.rs b/src/func/instances/effect.rs index 7524627..97ab7a0 100644 --- a/src/func/instances/effect.rs +++ b/src/func/instances/effect.rs @@ -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 { diff --git a/src/func/instances/future.rs b/src/func/instances/future.rs index 70be8bb..2440cd5 100644 --- a/src/func/instances/future.rs +++ b/src/func/instances/future.rs @@ -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; diff --git a/src/func/instances/lazy.rs b/src/func/instances/lazy.rs index 97ad3cc..2a5b620 100644 --- a/src/func/instances/lazy.rs +++ b/src/func/instances/lazy.rs @@ -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; diff --git a/src/func/instances/option.rs b/src/func/instances/option.rs index 297d1e5..da3604b 100644 --- a/src/func/instances/option.rs +++ b/src/func/instances/option.rs @@ -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; diff --git a/src/func/instances/overload.rs b/src/func/instances/overload.rs index 5813d8f..9ee1517 100644 --- a/src/func/instances/overload.rs +++ b/src/func/instances/overload.rs @@ -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); diff --git a/src/func/instances/result.rs b/src/func/instances/result.rs index d891743..d48a6e8 100644 --- a/src/func/instances/result.rs +++ b/src/func/instances/result.rs @@ -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); diff --git a/src/func/instances/solo.rs b/src/func/instances/solo.rs index b278c0b..555ce76 100644 --- a/src/func/instances/solo.rs +++ b/src/func/instances/solo.rs @@ -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; diff --git a/src/func/instances/stackless.rs b/src/func/instances/stackless.rs index ef50c50..5712a01 100644 --- a/src/func/instances/stackless.rs +++ b/src/func/instances/stackless.rs @@ -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 Oet<'a>>), diff --git a/src/func/instances/tryfuture.rs b/src/func/instances/tryfuture.rs index 4907da6..4d2f01e 100644 --- a/src/func/instances/tryfuture.rs +++ b/src/func/instances/tryfuture.rs @@ -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); diff --git a/src/rcore/context.rs b/src/rcore/context.rs index 030dd5a..fbe8685 100644 --- a/src/rcore/context.rs +++ b/src/rcore/context.rs @@ -1,3 +1,5 @@ +use fail::*; + use super::*; /// Execution context. diff --git a/src/rstd/fallible.rs b/src/rstd/fallible.rs index 7a0868b..91ab300 100644 --- a/src/rstd/fallible.rs +++ b/src/rstd/fallible.rs @@ -1,5 +1,7 @@ //! Shorthands for using [`Context::Fallible`]. +use fail::*; + use crate::func::context::*; use super::*;