use std::collections::HashMap;
use std::cell::Ref;
pub struct HashMapRefWrapper<'a, K, V: 'a> {
r: Ref<'a, HashMap<K, V>>
}
impl<'a, K, V: 'a> HashMapRefWrapper<'a, K, V> {
pub fn new(r: Ref<'a, HashMap<K, V>>) -> Self {
HashMapRefWrapper { r }
}
pub fn values(&'a self) -> std::collections::hash_map::Values<'a, K, V> {
self.r.values()
}
pub fn keys(&'a self) -> std::collections::hash_map::Keys<'a, K, V> {
self.r.keys()
}
pub fn len(&'a self) -> usize {
self.r.len()
}
pub fn iter(&'a self) -> std::collections::hash_map::Iter<'a, K, V> {
self.r.iter()
}
}
impl<'a, K, V: 'a + Clone> HashMapRefWrapper<'a, K, V> {
pub fn values_vec(&'a self) -> Vec<V> {
self.values().cloned().collect()
}
}
impl<'a, 'b: 'a, K, V: 'a + Clone> IntoIterator for &'b HashMapRefWrapper<'a, K, V> {
type Item = V;
type IntoIter = std::iter::Cloned<std::collections::hash_map::Values<'a, K, V>>;
fn into_iter(self) -> Self::IntoIter {
self.r.values().cloned()
}
}
pub struct RefWrapper<'a, I> {
r: Ref<'a, I>
}
impl<'a, I> RefWrapper<'a, I> {
pub fn new(r: Ref<'a, I>) -> Self {
RefWrapper { r }
}
}
impl<'a, I> RefWrapper<'a, I>
where I: ExactSizeIterator {
pub fn len(&'a self) -> usize {
self.r.len()
}
}
impl<'a, 'b: 'a, I, T: 'a> IntoIterator for &'b RefWrapper<'a, I>
where &'a I: IntoIterator<Item=T> {
type Item = <&'a I as IntoIterator>::Item;
type IntoIter = <&'a I as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.r.into_iter()
}
}
impl<'a, 'b: 'a, I, T: 'a> RefWrapper<'a, I>
where &'a I: IntoIterator<Item=T> {
pub fn iter(&'b self) -> impl Iterator<Item=<&'a I as IntoIterator>::Item> {
self.r.into_iter()
}
}
#[cfg(test)]
mod tests {
use std::cell::RefCell;
use crate::ref_wrapper::RefWrapper;
#[test]
fn test_refwrapper_into_iter() {
let vec = RefCell::new(vec![1, 2, 3]);
let i = RefWrapper::new(vec.borrow());
let collected: Vec<_> = i.into_iter().copied().collect();
assert_eq!(collected, vec![1, 2, 3]);
}
#[test]
fn test_refwrapper_iter() {
let vec = RefCell::new(vec![1, 2, 3]);
let i = RefWrapper::new(vec.borrow());
let collected: Vec<_> = i.iter().copied().collect();
assert_eq!(collected, vec![1, 2, 3]);
}
#[test]
fn test_refwrapper_iter_flatten() {
let vec = RefCell::new(vec![vec![1, 2], vec![3]]);
let i = RefWrapper::new(vec.borrow());
let collected: Vec<_> = i.iter().flatten().copied().collect();
assert_eq!(collected, vec![1, 2, 3]);
}
}