Diffstat (limited to 'src/build/builders/core/enum.rs')
-rw-r--r--src/build/builders/core/enum.rs39
1 files changed, 29 insertions, 10 deletions
diff --git a/src/build/builders/core/enum.rs b/src/build/builders/core/enum.rs
index f5ba931..2154f41 100644
--- a/src/build/builders/core/enum.rs
+++ b/src/build/builders/core/enum.rs
@@ -1,4 +1,5 @@
use core::fmt::{Debug, Display};
+use crate::hkt::{Marker, CovariantLt, BorrowsCtx};
use effectful::bound::Dynamic;
use effectful::effective::{Effective, Canonical};
@@ -248,16 +249,33 @@ where
'ctx: 'd + 'b + 'c,
'lt: 'a + 'c,
{
- let visitor = VariantVisitor::<Info, Mode, E> { marker: None };
-
- E::value((walker, visitor))
- .update_map((), |_, (walker, visitor)| {
- let y = DynVisitor(visitor);
- let x = walker.walk(y);
- let y = x.cast();
- y
- });
- todo!();
+ let visitor = VariantVisitor::<Info, Mode, E> { marker: None, _m: BorrowsCtx::NEW };
+
+ E::value((visitor, walker))
+ .update_map((), |_, (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()
+ }
+ })
+ .cast()
}
}
@@ -267,6 +285,7 @@ where
Info: EnumBuildInfo<'lt, 'ctx, Mode, E>,
{
marker: Option<Info::VariantMarker>,
+ _m: BorrowsCtx<'lt, 'ctx>,
}
impl<'lt, 'ctx: 'lt, Info, Mode: 'lt, E: Environment> AnyTrait<'lt, 'ctx> for VariantVisitor<'lt, 'ctx, Info, Mode, E>