pub trait EncodedOutput: HasElement + TranscodableIterable<<Self as HasElement>::Element> {}
impl<O> EncodedOutput for O where O: HasElement + TranscodableIterable<<O as HasElement>::Element> {}
pub trait TranscodableIterable<T>:
Extend<T> + AsRef<[T]> + FromIterator<T> + IntoIterator<Item = T>
{
}
impl<T, S> TranscodableIterable<T> for S
where
S: Extend<T> + AsRef<[T]> + FromIterator<T> + IntoIterator<Item = T>,
S::IntoIter: ExactSizeIterator,
{
}
pub trait HasElement {
type Element;
}
macro_rules! has_element {
($ty:ty, $elem:ty) => {
has_element!(@mut; $ty, $elem);
has_element!(@nomut; $ty, $elem);
};
($ty:ty, $elem:ty; $($tt:tt)*) => {
has_element!(@mut; $ty, $elem; $($tt)*);
has_element!(@nomut; $ty, $elem; $($tt)*);
};
(@nomut; $ty:ty, $elem:ty) => {
impl HasElement for $ty {
type Element = $elem;
}
};
(@nomut; $ty:ty, $elem:ty; $($tt:tt)*) => {
impl<$($tt)*> HasElement for $ty {
type Element = $elem;
}
};
(@mut; $ty:ty, $elem:ty) => {
impl HasElement for &mut $ty {
type Element = $elem;
}
};
(@mut; $ty:ty, $elem:ty; $($tt:tt)*) => {
impl<$($tt)*> HasElement for &mut $ty {
type Element = $elem;
}
};
}
has_element!(Vec<T>, T; T);
has_element!(Box<[T]>, T; T);
has_element!(@nomut; &[T], T; T);
has_element!(@nomut; &mut [T], T; T);
has_element!(String, char);
has_element!(@nomut; &str, char);
has_element!(@nomut; &mut str, char);
has_element!(dyn Iterator<Item = T>, T; T);