use crate::IMExIter;
use std::io::Result;
pub trait IMExMerges<T, I>
where
T: Iterator<Item = I>,
{
fn imex_merge_all(self, iters: &mut Vec<T>, imex: &str) -> Result<IMExIter<T, I>>;
fn rot_merge_all(self, iters: &mut Vec<T>) -> IMExIter<T, I>
where
Self: Sized,
{
let iter_count = (iters.len() + 1) as u8;
let imex = format!(
"({})*",
(0..iter_count)
.map(|x| format!("{}", x))
.collect::<String>()
);
self.imex_merge_all(iters, &imex)
.expect("Default imex should have been valid, but wasn't")
}
fn imex_merge(self, other: T, imex: &str) -> Result<IMExIter<T, I>>
where
Self: Sized,
{
self.imex_merge_all(&mut vec![other], imex)
}
fn alt_merge(self, other: T) -> IMExIter<T, I>
where
Self: Sized,
{
self.imex_merge(other, "(01)*")
.expect("Default imex should have been valid, but wasn't")
}
}
impl<T, I> IMExMerges<T, I> for T
where
T: Iterator<Item = I>,
{
fn imex_merge_all(self, iters: &mut Vec<T>, imex: &str) -> Result<IMExIter<T, I>> {
let mut total_iters = vec![self];
total_iters.append(iters);
IMExIter::<T, I>::new(total_iters, imex)
}
}