use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque};
use std::marker::PhantomData;
use crate::parsers::map::{MapParser, Mapping};
use crate::Parser;
#[derive(Debug, Clone, Copy, Default)]
pub struct Collect<C> {
phantom: PhantomData<fn() -> C>,
}
impl<V, C> Mapping<(V,)> for Collect<C>
where
V: IntoIterator,
C: FromIterator<V::Item>,
{
type RawOutput = (C,);
fn apply(&self, (value,): (V,)) -> (C,) {
(value.into_iter().collect(),)
}
}
pub fn hash_map<P, K, V>(parser: P) -> MapParser<P, Collect<HashMap<K, V>>>
where
P: Parser,
P::Output: IntoIterator<Item = (K, V)>,
{
MapParser {
inner: parser,
mapper: Collect::default(),
}
}
pub fn hash_set<P, V>(parser: P) -> MapParser<P, Collect<HashSet<V>>>
where
P: Parser,
P::Output: IntoIterator<Item = V>,
{
MapParser {
inner: parser,
mapper: Collect::default(),
}
}
pub fn btree_map<P, K, V>(parser: P) -> MapParser<P, Collect<BTreeMap<K, V>>>
where
P: Parser,
P::Output: IntoIterator<Item = (K, V)>,
{
MapParser {
inner: parser,
mapper: Collect::default(),
}
}
pub fn btree_set<P, V>(parser: P) -> MapParser<P, Collect<BTreeSet<V>>>
where
P: Parser,
P::Output: IntoIterator<Item = V>,
{
MapParser {
inner: parser,
mapper: Collect::default(),
}
}
pub fn vec_deque<P, V>(parser: P) -> MapParser<P, Collect<VecDeque<V>>>
where
P: Parser,
P::Output: IntoIterator<Item = V>,
{
MapParser {
inner: parser,
mapper: Collect::default(),
}
}