@@ -306,6 +306,14 @@ pub struct Iter<'a, T: 'a> {
306306 rx : & ' a Receiver < T >
307307}
308308
309+ /// An owning iterator over messages on a receiver, this iterator will block
310+ /// whenever `next` is called, waiting for a new message, and `None` will be
311+ /// returned when the corresponding channel has hung up.
312+ #[ stable( feature = "receiver_into_iter" , since = "1.1.0" ) ]
313+ pub struct IntoIter < T > {
314+ rx : Receiver < T >
315+ }
316+
309317/// The sending-half of Rust's asynchronous channel type. This half can only be
310318/// owned by one task, but it can be cloned to send to other tasks.
311319#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -899,6 +907,29 @@ impl<'a, T> Iterator for Iter<'a, T> {
899907 fn next ( & mut self ) -> Option < T > { self . rx . recv ( ) . ok ( ) }
900908}
901909
910+ #[ stable( feature = "receiver_into_iter" , since = "1.1.0" ) ]
911+ impl < ' a , T > IntoIterator for & ' a Receiver < T > {
912+ type Item = T ;
913+ type IntoIter = Iter < ' a , T > ;
914+
915+ fn into_iter ( self ) -> Iter < ' a , T > { self . iter ( ) }
916+ }
917+
918+ impl < T > Iterator for IntoIter < T > {
919+ type Item = T ;
920+ fn next ( & mut self ) -> Option < T > { self . rx . recv ( ) . ok ( ) }
921+ }
922+
923+ #[ stable( feature = "receiver_into_iter" , since = "1.1.0" ) ]
924+ impl < T > IntoIterator for Receiver < T > {
925+ type Item = T ;
926+ type IntoIter = IntoIter < T > ;
927+
928+ fn into_iter ( self ) -> IntoIter < T > {
929+ IntoIter { rx : self }
930+ }
931+ }
932+
902933#[ unsafe_destructor]
903934#[ stable( feature = "rust1" , since = "1.0.0" ) ]
904935impl < T > Drop for Receiver < T > {
@@ -1507,6 +1538,32 @@ mod test {
15071538 assert_eq ! ( count_rx. recv( ) . unwrap( ) , 4 ) ;
15081539 }
15091540
1541+ #[ test]
1542+ fn test_recv_into_iter_owned ( ) {
1543+ let mut iter = {
1544+ let ( tx, rx) = channel :: < i32 > ( ) ;
1545+ tx. send ( 1 ) . unwrap ( ) ;
1546+ tx. send ( 2 ) . unwrap ( ) ;
1547+
1548+ rx. into_iter ( )
1549+ } ;
1550+ assert_eq ! ( iter. next( ) . unwrap( ) , 1 ) ;
1551+ assert_eq ! ( iter. next( ) . unwrap( ) , 2 ) ;
1552+ assert_eq ! ( iter. next( ) . is_none( ) , true ) ;
1553+ }
1554+
1555+ #[ test]
1556+ fn test_recv_into_iter_borrowed ( ) {
1557+ let ( tx, rx) = channel :: < i32 > ( ) ;
1558+ tx. send ( 1 ) . unwrap ( ) ;
1559+ tx. send ( 2 ) . unwrap ( ) ;
1560+ drop ( tx) ;
1561+ let mut iter = ( & rx) . into_iter ( ) ;
1562+ assert_eq ! ( iter. next( ) . unwrap( ) , 1 ) ;
1563+ assert_eq ! ( iter. next( ) . unwrap( ) , 2 ) ;
1564+ assert_eq ! ( iter. next( ) . is_none( ) , true ) ;
1565+ }
1566+
15101567 #[ test]
15111568 fn try_recv_states ( ) {
15121569 let ( tx1, rx1) = channel :: < i32 > ( ) ;
0 commit comments