diff --git a/crates/types/src/compound/enumerated.rs b/crates/types/src/compound/enumerated.rs index dd54d1d..d46ca0c 100644 --- a/crates/types/src/compound/enumerated.rs +++ b/crates/types/src/compound/enumerated.rs @@ -128,6 +128,26 @@ where #[derive(Copy, Clone, Default, PartialEq)] struct Enum(D, L); +impl Enum<(Discr

,), L> { + pub fn new(v: Variants) -> Self + where + Variants: IntoList, + L: list::Meta, + { + Enum((Discr::default(),), v.into_list()) + } +} +impl Enum<(), L> { + pub fn internally_discriminated(v: Variants) -> Self + where + Variants: IntoList, + L: list::Meta + Indexable, + list::ElementAt: DiscriminantCodable<::Length>, + { + Enum((), v.into_list()) + } +} + trait EnumRequirements { type NumVariants: Peano; fn decode_discr(&self) -> Discr; @@ -300,4 +320,13 @@ mod test { e.set::(BoxedF32(0f32)); assert_eq!(e.dispatch(ReadReceiver), 0); } + + #[test] + fn new() { + let e = Enum::new((5u32, 4i32)); + assert_eq!(e.dispatch(ReadReceiver), 5); + + let e = Enum::internally_discriminated((BoxedF32(4f32), -1i32)); + assert_eq!(e.dispatch(ReadReceiver), 4); + } }