1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
use serde::{Deserialize, Serialize}; use std::ops::{Range, RangeFrom, RangeInclusive}; use super::{Consumer, DistributedIterator, IntoDistributedIterator}; use crate::pool::ProcessSend; pub trait IteratorExt: Iterator + Sized { fn dist(self) -> IterIter<Self> { IterIter(self) } } impl<I: Iterator + Sized> IteratorExt for I {} pub struct IterIter<I>(pub(super) I); impl<I: Iterator> DistributedIterator for IterIter<I> where I::Item: ProcessSend, { type Item = I::Item; type Task = IterIterConsumer<I::Item>; fn size_hint(&self) -> (usize, Option<usize>) { self.0.size_hint() } fn next_task(&mut self) -> Option<Self::Task> { self.0.next().map(IterIterConsumer) } } #[derive(Serialize, Deserialize)] pub struct IterIterConsumer<T>(T); impl<T> Consumer for IterIterConsumer<T> { type Item = T; fn run(self, i: &mut impl FnMut(Self::Item) -> bool) -> bool { i(self.0) } } impl<Idx> IntoDistributedIterator for Range<Idx> where Self: Iterator, <Self as Iterator>::Item: ProcessSend, { type Iter = IterIter<Self>; type Item = <Self as Iterator>::Item; fn into_dist_iter(self) -> Self::Iter where Self: Sized, { IterIter(self) } } impl<Idx> IntoDistributedIterator for RangeFrom<Idx> where Self: Iterator, <Self as Iterator>::Item: ProcessSend, { type Iter = IterIter<Self>; type Item = <Self as Iterator>::Item; fn into_dist_iter(self) -> Self::Iter where Self: Sized, { IterIter(self) } } impl<Idx> IntoDistributedIterator for RangeInclusive<Idx> where Self: Iterator, <Self as Iterator>::Item: ProcessSend, { type Iter = IterIter<Self>; type Item = <Self as Iterator>::Item; fn into_dist_iter(self) -> Self::Iter where Self: Sized, { IterIter(self) } }