#![doc = include_str!("README.md")]
#[doc(hidden)]
pub use sumtype_macro::_sumtrait_internal;
pub use sumtype_macro::sumtrait;
pub use sumtype_macro::sumtype;
#[doc(hidden)]
pub trait TypeRef<const RANDOM: usize, const N: usize> {
type Type: ?Sized;
}
pub mod traits {
use super::sumtrait;
#[doc(hidden)]
#[allow(non_camel_case_types)]
trait __SumTrait_Sealed_Read {}
impl<T: std::io::Read> __SumTrait_Sealed_Read for T {}
impl<T: std::io::Read> Read for T {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
T::read(self, buf)
}
}
#[doc(hidden)]
#[allow(non_camel_case_types)]
trait __SumTrait_Sealed_Iterator {}
impl<T: core::iter::Iterator> __SumTrait_Sealed_Iterator for T {}
impl<T: core::iter::Iterator> Iterator for T {
type Item = T::Item;
fn next(&mut self) -> Option<Self::Item> {
T::next(self)
}
}
macro_rules! emit_traits {
() => {
#[doc(hidden)]
pub struct ReadMarker(::core::convert::Infallible);
#[sumtrait(implement = ::std::io::Read, krate = $crate, marker = $crate::traits::ReadMarker)]
#[allow(private_bounds)]
pub trait Read: __SumTrait_Sealed_Read {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize>;
}
#[doc(hidden)]
pub struct IteratorMarker(::core::convert::Infallible);
#[sumtrait(implement = ::core::iter::Iterator, krate = $crate, marker = $crate::traits::IteratorMarker)]
#[allow(private_bounds)]
pub trait Iterator: __SumTrait_Sealed_Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
};
}
emit_traits!();
}