use crate::generic::{Field, Sum, Generic}; struct IntPair { a: i32, b: i32 } impl Generic for IntPair { type Representation = Sum, Field>; fn generalize(self) -> Self::Representation { Sum { left: Field { value: self.a }, right: Field { value: self.b } } } fn specialize(rep: Self::Representation) -> Self { let Sum { left: Field { value: a }, right: Field { value: b }, } = rep; IntPair { a, b } } } fn convert(x: IntPair) -> (i32, i32) { Generic::specialize(x.generalize()) }