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
use crossbeam_channel::SendError;

use crate::{
    id_targeted::IdTargeted, pool_item::PoolItem, request_with_response::RequestWithResponse,
    sender_couplet::SenderCouplet, ThreadPool,
};

use super::SenderAndReceiver;

/// An implementation of the [`ThreadPoolSenderAndReceiver`] trait for [`ThreadPool`]
impl<P> SenderAndReceiver<P> for ThreadPool<P>
where
    P: PoolItem,
{
    fn send_and_receive<'a, T>(
        &'a self,
        requests: impl Iterator<Item = T> + 'a,
    ) -> Result<Box<dyn Iterator<Item = T::Response> + 'a>, SendError<SenderCouplet<P>>>
    where
        T: RequestWithResponse<P> + IdTargeted + 'a,
    {
        match self.send_and_receive(requests) {
            Ok(result) => Ok(Box::new(result)),
            Err(err) => Err(err),
        }
    }
}