enum Either { Left(L), Right(R) } impl Either { fn cata T, G: FnOnce(&R) -> T>(&self, l: F, r: G) -> T { match *self { Either::Left (ref val) => l(val), Either::Right(ref val) => r(val) } } } fn main() { let val: Either<&str, &str> = Either::Right("lol"); println!("{}", val.cata(|l| "", |r| r)); }