extend_map/
lib.rs

1//! Wrap an `impl Extend` to map elements before extending.
2
3use std::marker::PhantomData;
4
5/// Wraps a type `Extender: Extend<ExtendElement>` and applies a mapping function before passing elements to the `Extender`.
6pub struct ExtendMap<
7    'extender,
8    InputElement,
9    ExtendElement,
10    Mapper: FnMut(InputElement) -> ExtendElement,
11    Extender: Extend<ExtendElement>,
12> {
13    extender: &'extender mut Extender,
14    mapper: Mapper,
15    phantom_data: PhantomData<(InputElement, ExtendElement)>,
16}
17
18impl<
19        'extender,
20        InputElement,
21        ExtendElement,
22        Mapper: FnMut(InputElement) -> ExtendElement,
23        Extender: Extend<ExtendElement>,
24    > ExtendMap<'extender, InputElement, ExtendElement, Mapper, Extender>
25{
26    pub fn new(extender: &'extender mut Extender, mapper: Mapper) -> Self {
27        Self {
28            extender,
29            mapper,
30            phantom_data: PhantomData,
31        }
32    }
33
34    pub fn into_inner(self) -> &'extender mut Extender {
35        self.extender
36    }
37}
38
39impl<
40        InputElement,
41        ExtendElement,
42        Mapper: FnMut(InputElement) -> ExtendElement,
43        Extender: Extend<ExtendElement>,
44    > Extend<InputElement> for ExtendMap<'_, InputElement, ExtendElement, Mapper, Extender>
45{
46    fn extend<T: IntoIterator<Item = InputElement>>(&mut self, iter: T) {
47        self.extender.extend(iter.into_iter().map(&mut self.mapper));
48    }
49}