use std::collections::{HashMap, HashSet, BTreeMap, BTreeSet, VecDeque, LinkedList};
pub trait Queryable<T> {
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_>;
}
impl<T> Queryable<T> for [T] {
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}
impl<T> Queryable<T> for Vec<T> {
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}
impl<T> Queryable<T> for VecDeque<T> {
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}
impl<T> Queryable<T> for LinkedList<T> {
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}
impl<T> Queryable<T> for HashSet<T>
where
T: Eq + std::hash::Hash,
{
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}
impl<T> Queryable<T> for BTreeSet<T>
where
T: Ord,
{
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}
impl<K, V> Queryable<V> for HashMap<K, V>
where
K: Eq + std::hash::Hash,
{
fn query_iter(&self) -> Box<dyn Iterator<Item = &V> + '_> {
Box::new(self.values())
}
}
impl<K, V> Queryable<V> for BTreeMap<K, V>
where
K: Ord,
{
fn query_iter(&self) -> Box<dyn Iterator<Item = &V> + '_> {
Box::new(self.values())
}
}
impl<T, const N: usize> Queryable<T> for [T; N] {
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}
impl<T> Queryable<T> for Option<T> {
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}
impl<T, E> Queryable<T> for Result<T, E> {
fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
Box::new(self.iter())
}
}