diff --git a/src/std.rs b/src/std.rs index 93c17f5..5ce6f46 100644 --- a/src/std.rs +++ b/src/std.rs @@ -35,3 +35,37 @@ impl ExtSerializable for S { vec } } + +pub trait ExtContext: Context { + fn unstuff<'a, A: 'a, E: 'a>( + wa: <::W as WeakFunctor>::F<'a, A>, + ) -> ::F<'a, Result> + where + Self: 'a; + + fn stuff<'a, A: 'a, E: 'a>( + fa: ::F<'a, Result>, + ) -> <::W as WeakFunctor>::F<'a, A> + where + Self: 'a; +} + +impl ExtContext for Ctx { + fn unstuff<'a, A: 'a, E: 'a>( + wa: <::W as WeakFunctor>::F<'a, A>, + ) -> ::F<'a, Result> + where + Self: 'a, + { + Self::Fallible::unstuff(wa) + } + + fn stuff<'a, A: 'a, E: 'a>( + fa: ::F<'a, Result>, + ) -> <::W as WeakFunctor>::F<'a, A> + where + Self: 'a, + { + Self::Fallible::stuff(fa) + } +} diff --git a/src/std/collections/rbtree/subset.rs b/src/std/collections/rbtree/subset.rs index 73cf1c2..e30c178 100644 --- a/src/std/collections/rbtree/subset.rs +++ b/src/std/collections/rbtree/subset.rs @@ -2,7 +2,7 @@ use std::rc::Rc; use crate::flow::traversible::*; use crate::func::*; -use crate::std::fallible::*; +use crate::std::{fallible::*, *}; use super::*; @@ -96,7 +96,7 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> > { as Functor>::fmap( |resolved| resolved as Rc>, - self.resolve(), + Ctx::stuff(self.resolve()), ) } @@ -117,7 +117,7 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> > { as Functor>::fmap( |resolved| resolved as Rc>, - self.resolve(), + Ctx::stuff(self.resolve()), ) } @@ -138,7 +138,7 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> > { as Functor>::fmap( |resolved| resolved as Rc>, - self.resolve(), + Ctx::stuff(self.resolve()), ) } diff --git a/src/std/fallible.rs b/src/std/fallible.rs index 4a2c493..c791b04 100644 --- a/src/std/fallible.rs +++ b/src/std/fallible.rs @@ -1,7 +1,5 @@ -use crate::func::classes::{composition::*, result::*}; - use super::*; -pub type FallibleMonad = CompositionClass<::T, ResultClass>; +pub type FallibleMonad = <::Fallible as MonadFailAny>::W; pub type FallibleWrapped<'a, Ctx, A, E> = as WeakFunctor>::F<'a, A>;