Diffstat (limited to 'src/build/builders/core/enum.rs')
| -rw-r--r-- | src/build/builders/core/enum.rs | 106 |
1 files changed, 60 insertions, 46 deletions
diff --git a/src/build/builders/core/enum.rs b/src/build/builders/core/enum.rs index 02fa9fe..aaa44ff 100644 --- a/src/build/builders/core/enum.rs +++ b/src/build/builders/core/enum.rs @@ -1,9 +1,8 @@ use core::fmt::{Debug, Display}; use effectful::bound::{Bool, IsSend, IsSync}; -use effectful::closure::Capture; -use effectful::environment::{DynBind, Environment, NativeForm}; use effectful::effective::Effective; +use effectful::environment::{DynBind, Environment, NativeForm}; use effectful::forward_send_sync; use effectful::higher_ranked::Mut; @@ -28,15 +27,19 @@ where inner: Inner<'ctx, Info, Mode, E>, } -unsafe impl<'ctx, Info, Mode, E: Environment> IsSend<E::NeedSend> for EnumBuilder<'ctx, Info, Mode, E> +unsafe impl<'ctx, Info, Mode, E: Environment> IsSend<E::NeedSend> + for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, -{} +{ +} -unsafe impl<'ctx, Info, Mode, E: Environment> IsSync<E::NeedSync> for EnumBuilder<'ctx, Info, Mode, E> +unsafe impl<'ctx, Info, Mode, E: Environment> IsSync<E::NeedSync> + for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, -{} +{ +} enum Inner<'ctx, Info, Mode, E: Environment> where @@ -48,22 +51,22 @@ where Value(Result<Info::T, Info::Error>), } -unsafe impl<'ctx, Info, Mode, E: Environment> IsSend<E::NeedSend> for Inner<'ctx, Info, Mode, E> -where - Info: EnumBuildInfo<'ctx, Mode, E>, -{} +unsafe impl<'ctx, Info, Mode, E: Environment> IsSend<E::NeedSend> for Inner<'ctx, Info, Mode, E> where + Info: EnumBuildInfo<'ctx, Mode, E> +{ +} -unsafe impl<'ctx, Info, Mode, E: Environment> IsSync<E::NeedSync> for Inner<'ctx, Info, Mode, E> -where - Info: EnumBuildInfo<'ctx, Mode, E>, -{} +unsafe impl<'ctx, Info, Mode, E: Environment> IsSync<E::NeedSync> for Inner<'ctx, Info, Mode, E> where + Info: EnumBuildInfo<'ctx, Mode, E> +{ +} pub trait EnumBuildInfo<'ctx, Mode, E: Environment> { type Builders: DynBind<E>; type Seed: DynBind<E>; - type Error: DynBind<E> + Debug + Display; + type Error: DynBind<E> + Debug + Display; type ValueT: TypeName::MemberType<E>; @@ -115,7 +118,8 @@ where { E::value(Self { inner: Inner::Seed(seed), - }).cast() + }) + .cast() } fn build<'a>(self) -> NativeForm<'a, Result<Self::Value, Self::Error>, E> @@ -183,10 +187,12 @@ where scope: DynRecoverableScope<'a, 'ctx, E>, ) -> NativeForm<'a, VisitResult, E> { match core::mem::replace(&mut self.inner, Inner::Temp) { - Inner::Seed(seed) => Info::guess_variant(seed, scope).map(Capture(self).fun_once(|this, result, _| { - this.inner = Inner::Value(result); - Flow::Done.into() - })).cast(), + Inner::Seed(seed) => Info::guess_variant(seed, scope) + .map(self, |this, result| { + this.inner = Inner::Value(result); + Flow::Done.into() + }) + .cast(), inner => { self.inner = inner; E::value(Flow::Continue.into()).cast() @@ -195,7 +201,8 @@ where } } -impl<'ctx, Info, Mode, E: Environment> Value<'ctx, Info::ValueT, E> for EnumBuilder<'ctx, Info, Mode, E> +impl<'ctx, Info, Mode, E: Environment> Value<'ctx, Info::ValueT, E> + for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, { @@ -212,7 +219,8 @@ where } } -impl<'ctx, Info, Mode, E: Environment> Tag<'ctx, tags::Variant, E> for EnumBuilder<'ctx, Info, Mode, E> +impl<'ctx, Info, Mode, E: Environment> Tag<'ctx, tags::Variant, E> + for EnumBuilder<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, { @@ -224,28 +232,30 @@ where let visitor = VariantVisitor::<Info, Mode, E> { marker: None }; E::value((visitor, walker)) - .update(Capture(()).fun_once_hrt::<Mut<_>, _>(|_, (visitor, walker), _| { - walker.walk(DynVisitor(visitor)).cast() - })) - .then(Capture(self).fun_once(|this, ((visitor, _), result), _| { - if let Some(variant) = visitor.marker { - match core::mem::replace(&mut this.inner, Inner::Temp) { - // A variant was given so we need to make the builder for - // it. - Inner::Seed(seed) => Info::new_builder(seed, variant).map(Capture((this, result)).fun_once(|(this, result), builder, _| { - this.inner = Inner::Builder { builder }; - result.to_done().into() - })).cast::<()>(), - inner => { - this.inner = inner; - E::value(result.to_done().into()).cast() + .update((), |_, (visitor, walker)| { + walker.walk(DynVisitor(visitor)).cast() + }) + .then(self, |this, ((visitor, _), result)| { + if let Some(variant) = visitor.marker { + match core::mem::replace(&mut this.inner, Inner::Temp) { + // A variant was given so we need to make the builder for + // it. + Inner::Seed(seed) => Info::new_builder(seed, variant) + .map((this, result), |(this, result), builder| { + this.inner = Inner::Builder { builder }; + result.to_done().into() + }) + .cast::<()>(), + inner => { + this.inner = inner; + E::value(result.to_done().into()).cast() + } } + } else { + E::value(result.to_done().into()).cast() } - } else { - E::value(result.to_done().into()).cast() - } - })) - .cast() + }) + .cast() } } @@ -256,15 +266,19 @@ where marker: Option<Info::VariantMarker>, } -unsafe impl<'ctx, Info, Mode, E: Environment> IsSend<E::NeedSend> for VariantVisitor<'ctx, Info, Mode, E> +unsafe impl<'ctx, Info, Mode, E: Environment> IsSend<E::NeedSend> + for VariantVisitor<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, -{} +{ +} -unsafe impl<'ctx, Info, Mode, E: Environment> IsSync<E::NeedSync> for VariantVisitor<'ctx, Info, Mode, E> +unsafe impl<'ctx, Info, Mode, E: Environment> IsSync<E::NeedSync> + for VariantVisitor<'ctx, Info, Mode, E> where Info: EnumBuildInfo<'ctx, Mode, E>, -{} +{ +} any_trait! { impl['ctx, Info, Mode][E] VariantVisitor<'ctx, Info, Mode, E> = [ |