@@ -277,6 +277,7 @@ fn from_iter_length_fail(length: usize, expected: usize) -> ! {
277
277
unsafe impl < T , N > GenericSequence < T > for GenericArray < T , N >
278
278
where
279
279
N : ArrayLength < T > ,
280
+ Self : IntoIterator < Item =T > ,
280
281
{
281
282
type Length = N ;
282
283
type Sequence = Self ;
@@ -297,6 +298,32 @@ where
297
298
298
299
destination. into_inner ( )
299
300
}
301
+
302
+ fn inverted_zip < B , U , F > ( self , lhs : GenericArray < B , Self :: Length > , mut f : F ) -> MappedSequence < GenericArray < B , Self :: Length > , B , U >
303
+ where
304
+ GenericArray < B , Self :: Length > :
305
+ GenericSequence < B , Length =Self :: Length > +
306
+ MappedGenericSequence < B , U > ,
307
+ Self : MappedGenericSequence < T , U > ,
308
+ Self :: Length : ArrayLength < B > + ArrayLength < U > ,
309
+ F : FnMut ( B , Self :: Item ) -> U
310
+ {
311
+ let mut left = ArrayConsumer :: new ( lhs) ;
312
+ let mut right = ArrayConsumer :: new ( self ) ;
313
+
314
+ let ArrayConsumer { array : ref left_array, position : ref mut left_position } = left;
315
+ let ArrayConsumer { array : ref right_array, position : ref mut right_position } = right;
316
+
317
+ FromIterator :: from_iter ( left_array. iter ( ) . zip ( right_array. iter ( ) ) . map ( |( l, r) | {
318
+ let left_value = unsafe { ptr:: read ( l) } ;
319
+ let right_value = unsafe { ptr:: read ( r) } ;
320
+
321
+ * left_position += 1 ;
322
+ * right_position += 1 ;
323
+
324
+ f ( left_value, right_value)
325
+ } ) )
326
+ }
300
327
}
301
328
302
329
unsafe impl < T , U , N > MappedGenericSequence < T , U > for GenericArray < T , N >
@@ -310,7 +337,7 @@ where
310
337
unsafe impl < T , N > FunctionalSequence < T > for GenericArray < T , N >
311
338
where
312
339
N : ArrayLength < T > ,
313
- Self : GenericSequence < T , Item =T >
340
+ Self : GenericSequence < T , Item =T , Length = N >
314
341
{
315
342
fn map < U , F > ( self , mut f : F ) -> MappedSequence < Self , T , U >
316
343
where
@@ -331,24 +358,16 @@ where
331
358
} ) )
332
359
}
333
360
334
- fn zip < B , Rhs , U , F > ( self , rhs : Rhs , mut f : F ) -> MappedSequence < Self , T , U >
361
+ #[ inline]
362
+ fn zip < B , Rhs , U , F > ( self , rhs : Rhs , f : F ) -> MappedSequence < Self , T , U >
335
363
where
336
364
Self : MappedGenericSequence < T , U > ,
365
+ Rhs : MappedGenericSequence < B , U , Mapped =MappedSequence < Self , T , U > > ,
337
366
Self :: Length : ArrayLength < B > + ArrayLength < U > ,
338
- Rhs : GenericSequence < B > ,
367
+ Rhs : GenericSequence < B , Length = Self :: Length > ,
339
368
F : FnMut ( T , SequenceItem < Rhs > ) -> U ,
340
369
{
341
- let mut left = ArrayConsumer :: new ( self ) ;
342
-
343
- let ArrayConsumer { ref array, ref mut position } = left;
344
-
345
- FromIterator :: from_iter ( array. iter ( ) . zip ( rhs. into_iter ( ) ) . map ( |( l, right_value) | {
346
- let left_value = unsafe { ptr:: read ( l) } ;
347
-
348
- * position += 1 ;
349
-
350
- f ( left_value, right_value)
351
- } ) )
370
+ rhs. inverted_zip ( self , f)
352
371
}
353
372
}
354
373
@@ -489,7 +508,7 @@ mod test {
489
508
let a = black_box ( arr ! [ i32 ; 1 , 3 , 5 , 7 ] ) ;
490
509
let b = black_box ( arr ! [ i32 ; 2 , 4 , 6 , 8 ] ) ;
491
510
492
- let c = a. zip ( & b, |l : i32 , r : & i32 | l + r) ;
511
+ let c = a. zip ( b, |l, r| l + r) ;
493
512
494
513
assert_eq ! ( c, arr![ i32 ; 3 , 7 , 11 , 15 ] ) ;
495
514
}
0 commit comments