Macro lending_iterator::Gat
Gat!() { /* proc-macro */ }
Expand description
You can use this macro around a type to get access to:
-
<I as LendingIterator>::Item<'lt>
(if for some reason you did not likeItem<'lt, I>
); -
impl for<'n> LendingIterator<Item<'n> = …>
.
You can also use it in conjunction with #[apply]
, as in
#[apply(Gat!)]
, to annotate an item with it so as to:
-
get the previous functionality applied to all types occurrences in that annotated item;
-
get
LendingIterator<Item<'…> = …>
kind of trait bounds (e.g., as a inI : …
clauses, or as a super trait) to also work anywhere on the annotated item (this is something no targeted macro could ever support, due to language limitations).
Example
-
use ::lending_iterator::prelude::*; #[apply(Gat!)] fn my_iter_1<T> (slice: &'_ mut [T]) -> impl '_ + for<'n> LendingIterator<Item<'n> = &'n mut [T; 2]> { windows_mut::<T, 2>(slice) } // same as: fn my_iter_2<T> (slice: &'_ mut [T]) -> Gat!(impl '_ + for<'n> LendingIterator<Item<'n> = &'n mut [T; 2]>) { windows_mut::<T, 2>(slice) } #[apply(Gat!)] fn print_all<I, T> (mut iter: I) where T : ::core::fmt::Debug, // Trait bound on GAT for<'n> <I as LendingIterator>::Item<'n> : Send , // Equality constraint on GAT I : for<'n> LendingIterator<Item<'n> = &'n mut [T; 2]>, { iter.for_each(|&mut [ref x, ref y]| { dbg!(x, y); }); }
- See the documentation of
::nougat::Gat!
for more info about this.