macro_rules! take_range_method {
{
$(#[$attr:ident])*
fn take_range(&mut $self:ident, $range:ident: $Range:ty)
$body:block
} => {
$(#[$attr])*
fn take_range(&mut $self, $range: $Range) -> Self::Output
$body
};
{
$(#[$attr:ident])*
fn remove_range(&mut $self:ident, $range:ident: $Range:ty)
$body:block
} => {
$(#[$attr])*
fn remove_range(&mut $self, $range: $Range)
$body
};
}
macro_rules! impl_take_range {
{
$(
<$Range:ty> for $T:ty {
$(
$(#[$attr:ident])*
fn $method:ident(&mut $self:ident, $range:ident)
$body:block
)*
}
)*
} => {
$(
impl $crate::TakeRange<$Range> for $T {
type Output = $T;
$(
take_range_method! {
$(#[$attr])*
fn $method(&mut $self, $range: $Range)
$body
}
)*
}
)*
};
}