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