use std::collections::HashMap;
pub trait ReplacementProvider<'r, E: 'r> {
type Key;
type Iter: Iterator<Item = &'r E>;
fn take_replacement(&'r self, key: &Self::Key) -> Option<Self::Iter>;
}
impl<'r, E: 'r> ReplacementProvider<'r, E> for Vec<Vec<E>> {
type Key = usize;
type Iter = std::slice::Iter<'r, E>;
fn take_replacement(&'r self, input: &usize) -> Option<Self::Iter> {
let replacement = self.get(*input)?;
Some(replacement.iter())
}
}
impl<'r, E: 'r> ReplacementProvider<'r, E> for Vec<E> {
type Key = usize;
type Iter = std::iter::Once<&'r E>;
fn take_replacement(&'r self, input: &usize) -> Option<Self::Iter> {
let replacement = self.get(*input)?;
Some(std::iter::once(replacement))
}
}
impl<'r, E: 'r> ReplacementProvider<'r, E> for HashMap<String, Vec<E>> {
type Key = String;
type Iter = std::slice::Iter<'r, E>;
fn take_replacement(&'r self, input: &String) -> Option<Self::Iter> {
let replacement = self.get(input)?;
Some(replacement.iter())
}
}
impl<'r, E: 'r> ReplacementProvider<'r, E> for HashMap<String, E> {
type Key = String;
type Iter = std::iter::Once<&'r E>;
fn take_replacement(&'r self, input: &String) -> Option<Self::Iter> {
let replacement = self.get(input)?;
Some(std::iter::once(replacement))
}
}