Diffstat (limited to 'src/build/builders/core/enum.rs')
-rw-r--r--src/build/builders/core/enum.rs106
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> = [