use crate::array::iterator::{distributed_iterator::*, IterLockFuture};
#[derive(Clone, Debug)]
pub struct Map<I, F> {
iter: I,
f: F,
}
impl<I: InnerIter, F: Clone> InnerIter for Map<I, F> {
fn lock_if_needed(&self, _s: Sealed) -> Option<IterLockFuture> {
self.iter.lock_if_needed(_s)
}
fn iter_clone(&self, _s: Sealed) -> Self {
Map {
iter: self.iter.iter_clone(Sealed),
f: self.f.clone(),
}
}
}
impl<I, F> Map<I, F>
where
I: DistributedIterator,
{
pub(crate) fn new(iter: I, f: F) -> Map<I, F> {
Map { iter, f }
}
}
impl<B, I, F> DistributedIterator for Map<I, F>
where
I: DistributedIterator,
F: FnMut(I::Item) -> B + SyncSend + Clone + 'static,
B: Send,
{
type Item = B;
type Array = <I as DistributedIterator>::Array;
fn init(&self, start_i: usize, cnt: usize, _s: Sealed) -> Map<I, F> {
Map::new(self.iter.init(start_i, cnt, _s), self.f.clone())
}
fn array(&self) -> Self::Array {
self.iter.array()
}
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(&mut self.f)
}
fn elems(&self, in_elems: usize) -> usize {
let in_elems = self.iter.elems(in_elems);
in_elems
}
fn advance_index(&mut self, count: usize) {
self.iter.advance_index(count);
}
}