pub trait OptionToOwned<T> {
fn unwrap_to_owned_or_else<F>(&self, f: F) -> T
where
F: Fn() -> T;
}
impl<T> OptionToOwned<T> for Option<&T>
where
T: ToOwned<Owned = T>,
{
fn unwrap_to_owned_or_else<F>(&self, f: F) -> T
where
F: Fn() -> T,
{
self.map(|o| o.to_owned()).unwrap_or_else(f)
}
}
pub trait ToOwnedExt<T> {
fn to_owned(&self) -> T;
}
impl<T, R> ToOwnedExt<Vec<R>> for Vec<&T>
where
T: ToOwned<Owned = R> + ?Sized,
{
fn to_owned(&self) -> Vec<R> {
self.iter().map(|&o| o.to_owned()).collect()
}
}
impl<T, R> ToOwnedExt<Option<R>> for Option<&T>
where
T: ToOwned<Owned = R> + ?Sized,
{
fn to_owned(&self) -> Option<R> {
self.map(|o| o.to_owned())
}
}