@@ -61,14 +61,11 @@ impl Deduplicator {
61
61
/// Find duplicates in the given collection of events, and return both
62
62
/// valid events (those with an event id) as well as the event ids of
63
63
/// duplicate events.
64
- pub async fn filter_duplicate_events < I > (
64
+ pub async fn filter_duplicate_events (
65
65
& self ,
66
- events : I ,
66
+ events : Vec < Event > ,
67
67
room_events : & RoomEvents ,
68
- ) -> Result < ( Vec < Event > , Vec < OwnedEventId > ) , EventCacheError >
69
- where
70
- I : Iterator < Item = Event > ,
71
- {
68
+ ) -> Result < ( Vec < Event > , Vec < OwnedEventId > ) , EventCacheError > {
72
69
match self {
73
70
Deduplicator :: InMemory ( dedup) => Ok ( dedup. filter_duplicate_events ( events, room_events) ) ,
74
71
Deduplicator :: PersistentStore ( dedup) => dedup. filter_duplicate_events ( events) . await ,
@@ -89,28 +86,24 @@ pub struct StoreDeduplicator {
89
86
}
90
87
91
88
impl StoreDeduplicator {
92
- async fn filter_duplicate_events < I > (
89
+ async fn filter_duplicate_events (
93
90
& self ,
94
- events : I ,
95
- ) -> Result < ( Vec < Event > , Vec < OwnedEventId > ) , EventCacheError >
96
- where
97
- I : Iterator < Item = Event > ,
98
- {
91
+ mut events : Vec < Event > ,
92
+ ) -> Result < ( Vec < Event > , Vec < OwnedEventId > ) , EventCacheError > {
99
93
let store = self . store . lock ( ) . await ?;
100
94
101
95
// Collect event ids as we "validate" events (i.e. check they have a valid event
102
96
// id.)
103
97
let mut event_ids = Vec :: new ( ) ;
104
- let events = events
105
- . filter_map ( |event| {
106
- if let Some ( event_id) = event. event_id ( ) {
107
- event_ids. push ( event_id) ;
108
- Some ( event)
109
- } else {
110
- None
111
- }
112
- } )
113
- . collect :: < Vec < _ > > ( ) ;
98
+
99
+ events. retain ( |event| {
100
+ if let Some ( event_id) = event. event_id ( ) {
101
+ event_ids. push ( event_id) ;
102
+ true
103
+ } else {
104
+ false
105
+ }
106
+ } ) ;
114
107
115
108
// Let the store do its magic ✨
116
109
let duplicates = store. filter_duplicated_events ( & self . room_id , event_ids) . await ?;
@@ -157,18 +150,15 @@ impl BloomFilterDeduplicator {
157
150
/// Find duplicates in the given collection of events, and return both
158
151
/// valid events (those with an event id) as well as the event ids of
159
152
/// duplicate events.
160
- fn filter_duplicate_events < ' a , I > (
161
- & ' a self ,
162
- events : I ,
163
- room_events : & ' a RoomEvents ,
164
- ) -> ( Vec < Event > , Vec < OwnedEventId > )
165
- where
166
- I : Iterator < Item = Event > + ' a ,
167
- {
153
+ fn filter_duplicate_events (
154
+ & self ,
155
+ events : Vec < Event > ,
156
+ room_events : & RoomEvents ,
157
+ ) -> ( Vec < Event > , Vec < OwnedEventId > ) {
168
158
let mut duplicated_event_ids = Vec :: new ( ) ;
169
159
170
160
let events = self
171
- . scan_and_learn ( events, room_events)
161
+ . scan_and_learn ( events. into_iter ( ) , room_events)
172
162
. filter_map ( |decorated_event| match decorated_event {
173
163
Decoration :: Unique ( event) => Some ( event) ,
174
164
Decoration :: Duplicated ( event) => {
0 commit comments