1use std::marker::PhantomData;
4
5pub 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}