forked from libre-chip/fayalite
add Iterator<Item = Pair<T, P>> helpers
This commit is contained in:
parent
c94a437686
commit
7963f0a5cd
3 changed files with 140 additions and 45 deletions
|
@ -7,7 +7,9 @@ use std::io::{ErrorKind, Write};
|
|||
use syn::{
|
||||
bracketed, parenthesized,
|
||||
parse::{Parse, ParseStream, Parser},
|
||||
parse_quote, AttrStyle, Attribute, Error, Item, Token,
|
||||
parse_quote,
|
||||
punctuated::Pair,
|
||||
AttrStyle, Attribute, Error, Item, Token,
|
||||
};
|
||||
|
||||
mod fold;
|
||||
|
@ -318,6 +320,108 @@ impl<T: Parse> HdlAttr<T> {
|
|||
}
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub(crate) trait PairsIterExt: Sized + Iterator {
|
||||
fn map_pair<T1, T2, P1, P2, ValueFn: FnMut(T1) -> T2, PunctFn: FnMut(P1) -> P2>(
|
||||
self,
|
||||
mut value_fn: ValueFn,
|
||||
mut punct_fn: PunctFn,
|
||||
) -> impl Iterator<Item = Pair<T2, P2>>
|
||||
where
|
||||
Self: Iterator<Item = Pair<T1, P1>>,
|
||||
{
|
||||
self.map(move |p| {
|
||||
let (t, p) = p.into_tuple();
|
||||
let t = value_fn(t);
|
||||
let p = p.map(&mut punct_fn);
|
||||
Pair::new(t, p)
|
||||
})
|
||||
}
|
||||
fn filter_map_pair<T1, T2, P1, P2, ValueFn: FnMut(T1) -> Option<T2>, PunctFn: FnMut(P1) -> P2>(
|
||||
self,
|
||||
mut value_fn: ValueFn,
|
||||
mut punct_fn: PunctFn,
|
||||
) -> impl Iterator<Item = Pair<T2, P2>>
|
||||
where
|
||||
Self: Iterator<Item = Pair<T1, P1>>,
|
||||
{
|
||||
self.filter_map(move |p| {
|
||||
let (t, p) = p.into_tuple();
|
||||
let t = value_fn(t)?;
|
||||
let p = p.map(&mut punct_fn);
|
||||
Some(Pair::new(t, p))
|
||||
})
|
||||
}
|
||||
fn map_pair_value<T1, T2, P, F: FnMut(T1) -> T2>(
|
||||
self,
|
||||
f: F,
|
||||
) -> impl Iterator<Item = Pair<T2, P>>
|
||||
where
|
||||
Self: Iterator<Item = Pair<T1, P>>,
|
||||
{
|
||||
self.map_pair(f, |v| v)
|
||||
}
|
||||
fn filter_map_pair_value<T1, T2, P, F: FnMut(T1) -> Option<T2>>(
|
||||
self,
|
||||
f: F,
|
||||
) -> impl Iterator<Item = Pair<T2, P>>
|
||||
where
|
||||
Self: Iterator<Item = Pair<T1, P>>,
|
||||
{
|
||||
self.filter_map_pair(f, |v| v)
|
||||
}
|
||||
fn map_pair_value_mut<'a, T1: 'a, T2: 'a, P: Clone + 'a, F: FnMut(T1) -> T2 + 'a>(
|
||||
self,
|
||||
f: F,
|
||||
) -> impl Iterator<Item = Pair<T2, P>> + 'a
|
||||
where
|
||||
Self: Iterator<Item = Pair<T1, &'a mut P>> + 'a,
|
||||
{
|
||||
self.map_pair(f, |v| v.clone())
|
||||
}
|
||||
fn filter_map_pair_value_mut<
|
||||
'a,
|
||||
T1: 'a,
|
||||
T2: 'a,
|
||||
P: Clone + 'a,
|
||||
F: FnMut(T1) -> Option<T2> + 'a,
|
||||
>(
|
||||
self,
|
||||
f: F,
|
||||
) -> impl Iterator<Item = Pair<T2, P>> + 'a
|
||||
where
|
||||
Self: Iterator<Item = Pair<T1, &'a mut P>> + 'a,
|
||||
{
|
||||
self.filter_map_pair(f, |v| v.clone())
|
||||
}
|
||||
fn map_pair_value_ref<'a, T1: 'a, T2: 'a, P: Clone + 'a, F: FnMut(T1) -> T2 + 'a>(
|
||||
self,
|
||||
f: F,
|
||||
) -> impl Iterator<Item = Pair<T2, P>> + 'a
|
||||
where
|
||||
Self: Iterator<Item = Pair<T1, &'a P>> + 'a,
|
||||
{
|
||||
self.map_pair(f, |v| v.clone())
|
||||
}
|
||||
fn filter_map_pair_value_ref<
|
||||
'a,
|
||||
T1: 'a,
|
||||
T2: 'a,
|
||||
P: Clone + 'a,
|
||||
F: FnMut(T1) -> Option<T2> + 'a,
|
||||
>(
|
||||
self,
|
||||
f: F,
|
||||
) -> impl Iterator<Item = Pair<T2, P>> + 'a
|
||||
where
|
||||
Self: Iterator<Item = Pair<T1, &'a P>> + 'a,
|
||||
{
|
||||
self.filter_map_pair(f, |v| v.clone())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, P, Iter: Iterator<Item = Pair<T, P>>> PairsIterExt for Iter {}
|
||||
|
||||
pub(crate) struct Errors {
|
||||
error: Option<Error>,
|
||||
finished: bool,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue