#[macro_export]
macro_rules! iter {
(
$mapped_expr:expr ,
for $var:pat in $iterable:expr ,
if $cond:expr $(,)?
) => (
$iterable
.into_iter()
.filter_map(|$var| {
if $cond {
Some($mapped_expr)
} else {
None
}
})
);
(
$mapped_expr:expr ,
for $var:pat in $iterable:expr ,
if let $( $pat:pat )|+ = $value:expr $(,)?
) => (
$iterable
.into_iter()
.filter_map(|$var| {
if let $( $pat )|+ = $value {
Some($mapped_expr)
} else {
None
}
})
);
(
$mapped_expr:expr ,
for $var:pat in $iterable:expr $(,)?
) => (
$iterable
.into_iter()
.map(|$var| $mapped_expr)
);
(@parsing_mapped_expr
$mapped_expression:tt
for
$($rest:tt)*
) => ($crate::iter!(@parsing_for
$mapped_expression
[ for ] $($rest)*
));
(@parsing_mapped_expr
[ $($mapped_expression_tts:tt)* ]
$current_tt:tt
$($rest:tt)*
) => ($crate::iter!(@parsing_mapped_expr
[ $($mapped_expression_tts)* $current_tt ]
$($rest)*
));
(@parsing_for
[ $($mapped_expression_tts:tt)* ]
[ $($for_body_tts:tt)* ]
) => ($crate::iter!(
$($mapped_expression_tts)* ,
$($for_body_tts)*,
));
(@parsing_for
[ $($mapped_expression_tts:tt)* ]
[ $($for_body_tts:tt)* ]
if
$($rest:tt)*
) => ($crate::iter!(
$($mapped_expression_tts)* ,
$($for_body_tts)* ,
if $($rest)*
));
(@parsing_for
$mapped_expression:tt
[ $($for_body_tts:tt)* ]
$current_tt:tt
$($rest:tt)*
) => ($crate::iter!(@parsing_for
$mapped_expression
[ $($for_body_tts)* $current_tt ]
$($rest)*
));
(
$($tt:tt)*
) => ($crate::iter!(@parsing_mapped_expr
[] $($tt)*
));
}
#[macro_export]
macro_rules! vec_it {
(
$expr:expr ,
for $var:pat in $iterable:expr
$(
,
$($if_cond:tt)*
)?
) => (
$crate::iter!(
$expr,
for $var in $iterable
$(
,
$($if_cond)*
)?
).collect::<::std::vec::Vec<_>>()
);
(@parsing_mapped_expr
$fallback_to_vec:tt
) => (
::std::vec! $fallback_to_vec
);
(@parsing_mapped_expr
$mapped_expression:tt
for
$($rest:tt)*
) => ($crate::vec_it!(@parsing_for
$mapped_expression
[ for ] $($rest)*
));
(@parsing_mapped_expr
[ $($mapped_expression_tts:tt)* ]
$current_tt:tt
$($rest:tt)*
) => ($crate::vec_it!(@parsing_mapped_expr
[ $($mapped_expression_tts)* $current_tt ]
$($rest)*
));
(@parsing_for
[ $($mapped_expression_tts:tt)* ]
[ $($for_body_tts:tt)* ]
) => ($crate::vec_it!(
$($mapped_expression_tts)* ,
$($for_body_tts)* ,
));
(@parsing_for
[ $($mapped_expression_tts:tt)* ]
[ $($for_body_tts:tt)* ]
if
$($rest:tt)*
) => ($crate::vec_it!(
$($mapped_expression_tts)* ,
$($for_body_tts)*,
if $($rest)*
));
(@parsing_for
$mapped_expression:tt
[ $($for_body_tts:tt)* ]
$current_tt:tt
$($rest:tt)*
) => ($crate::vec_it!(@parsing_for
$mapped_expression
[ $($for_body_tts)* $current_tt ]
$($rest)*
));
(
$($tt:tt)*
) => ($crate::vec_it!(@parsing_mapped_expr
[] $($tt)*
));
}