// Ref: https://github.com/rust-lang/rust/issues/23563#issuecomment-260751672 pub trait LolTo { fn convert_to(&self) -> T; } pub trait LolInto: Sized { fn convert_into(self) -> T; } pub trait LolFrom { fn from(_: T) -> Self; } impl<'a, T: ?Sized, U> LolInto for &'a T where T: LolTo { fn convert_into(self) -> U { self.convert_to() } } impl LolFrom for U where T: LolInto { fn from(t: T) -> U { t.convert_into() } }