@@ -200,6 +200,34 @@ impl<M> RoundMsgs<M> {
200
200
. chain ( self . messages . iter ( ) . skip ( usize:: from ( self . i ) ) )
201
201
}
202
202
203
+ /// Returns iterator over received messages plus party's own message
204
+ pub fn into_iter_including_me < ' m > ( self , my_msg : M ) -> impl Iterator < Item = M > {
205
+ struct InsertsAfter < T , It > {
206
+ offset : usize ,
207
+ inner : It ,
208
+ item : Option < T > ,
209
+ }
210
+ impl < T , It : Iterator < Item = T > > Iterator for InsertsAfter < T , It > {
211
+ type Item = T ;
212
+ fn next ( & mut self ) -> Option < Self :: Item > {
213
+ if self . offset == 0 {
214
+ match self . item . take ( ) {
215
+ Some ( x) => Some ( x) ,
216
+ None => self . inner . next ( ) ,
217
+ }
218
+ } else {
219
+ self . offset -= 1 ;
220
+ self . inner . next ( )
221
+ }
222
+ }
223
+ }
224
+ InsertsAfter {
225
+ offset : usize:: from ( self . i ) ,
226
+ inner : self . messages . into_iter ( ) ,
227
+ item : Some ( my_msg)
228
+ }
229
+ }
230
+
203
231
/// Returns iterator over messages with sender indexes
204
232
///
205
233
/// Iterator yields `(sender_index, msg_id, message)`
@@ -458,4 +486,34 @@ mod tests {
458
486
} )
459
487
. unwrap ( ) ;
460
488
}
489
+
490
+ #[ test]
491
+ fn into_iter_including_me ( ) {
492
+ let me = -10_isize ;
493
+ let messages = alloc:: vec![ 1 , 2 , 3 ] ;
494
+
495
+ let me_first = super :: RoundMsgs {
496
+ i : 0 ,
497
+ ids : alloc:: vec![ 1 , 2 , 3 ] ,
498
+ messages : messages. clone ( ) ,
499
+ } ;
500
+ let all = me_first. into_iter_including_me ( me) . collect :: < Vec < _ > > ( ) ;
501
+ assert_eq ! ( all, [ -10 , 1 , 2 , 3 ] ) ;
502
+
503
+ let me_second = super :: RoundMsgs {
504
+ i : 1 ,
505
+ ids : alloc:: vec![ 0 , 2 , 3 ] ,
506
+ messages : messages. clone ( ) ,
507
+ } ;
508
+ let all = me_second. into_iter_including_me ( me) . collect :: < Vec < _ > > ( ) ;
509
+ assert_eq ! ( all, [ 1 , -10 , 2 , 3 ] ) ;
510
+
511
+ let me_last = super :: RoundMsgs {
512
+ i : 3 ,
513
+ ids : alloc:: vec![ 0 , 1 , 2 ] ,
514
+ messages : messages. clone ( ) ,
515
+ } ;
516
+ let all = me_last. into_iter_including_me ( me) . collect :: < Vec < _ > > ( ) ;
517
+ assert_eq ! ( all, [ 1 , 2 , 3 , -10 ] ) ;
518
+ }
461
519
}
0 commit comments