@@ -22,6 +22,7 @@ use kinds::Copy;
2222use io:: { mod, IoResult , IoError } ;
2323use io:: net;
2424use iter:: { Iterator , IteratorExt } ;
25+ use ops:: FnOnce ;
2526use option:: Option ;
2627use option:: Option :: { None , Some } ;
2728use result:: Result :: { Ok , Err } ;
@@ -100,8 +101,9 @@ impl<'a> Parser<'a> {
100101 }
101102
102103 // Commit only if parser returns Some
103- fn read_atomically < T > ( & mut self , cb: |& mut Parser | -> Option < T > )
104- -> Option < T > {
104+ fn read_atomically < T , F > ( & mut self , cb : F ) -> Option < T > where
105+ F : FnOnce ( & mut Parser ) -> Option < T > ,
106+ {
105107 let pos = self . pos ;
106108 let r = cb ( self ) ;
107109 if r. is_none ( ) {
@@ -111,9 +113,10 @@ impl<'a> Parser<'a> {
111113 }
112114
113115 // Commit only if parser read till EOF
114- fn read_till_eof < T > ( & mut self , cb: |& mut Parser | -> Option < T > )
115- -> Option < T > {
116- self . read_atomically( |p| {
116+ fn read_till_eof < T , F > ( & mut self , cb : F ) -> Option < T > where
117+ F : FnOnce ( & mut Parser ) -> Option < T > ,
118+ {
119+ self . read_atomically ( move |p| {
117120 match cb ( p) {
118121 Some ( x) => if p. is_eof ( ) { Some ( x) } else { None } ,
119122 None => None ,
@@ -134,15 +137,16 @@ impl<'a> Parser<'a> {
134137 }
135138
136139 // Apply 3 parsers sequentially
137- fn read_seq_3 < A ,
138- B ,
139- C > (
140- & mut self ,
141- pa: |& mut Parser | -> Option < A > ,
142- pb: |& mut Parser | -> Option < B > ,
143- pc: |& mut Parser | -> Option < C > )
144- -> Option < ( A , B , C ) > {
145- self . read_atomically( |p| {
140+ fn read_seq_3 < A , B , C , PA , PB , PC > ( & mut self ,
141+ pa : PA ,
142+ pb : PB ,
143+ pc : PC )
144+ -> Option < ( A , B , C ) > where
145+ PA : FnOnce ( & mut Parser ) -> Option < A > ,
146+ PB : FnOnce ( & mut Parser ) -> Option < B > ,
147+ PC : FnOnce ( & mut Parser ) -> Option < C > ,
148+ {
149+ self . read_atomically ( move |p| {
146150 let a = pa ( p) ;
147151 let b = if a. is_some ( ) { pb ( p) } else { None } ;
148152 let c = if b. is_some ( ) { pc ( p) } else { None } ;
@@ -327,22 +331,22 @@ impl<'a> Parser<'a> {
327331 }
328332
329333 fn read_socket_addr ( & mut self ) -> Option < SocketAddr > {
330- let ip_addr = |p : & mut Parser | {
334+ let ip_addr = |& : p: & mut Parser | {
331335 let ipv4_p = |p : & mut Parser | p. read_ip_addr ( ) ;
332336 let ipv6_p = |p : & mut Parser | {
333- let open_br = |p : & mut Parser | p. read_given_char ( '[' ) ;
334- let ip_addr = |p : & mut Parser | p. read_ipv6_addr ( ) ;
335- let clos_br = |p : & mut Parser | p. read_given_char ( ']' ) ;
336- p. read_seq_3 :: < char , IpAddr , char > ( open_br, ip_addr, clos_br)
337+ let open_br = |& : p: & mut Parser | p. read_given_char ( '[' ) ;
338+ let ip_addr = |& : p: & mut Parser | p. read_ipv6_addr ( ) ;
339+ let clos_br = |& : p: & mut Parser | p. read_given_char ( ']' ) ;
340+ p. read_seq_3 :: < char , IpAddr , char , _ , _ , _ > ( open_br, ip_addr, clos_br)
337341 . map ( |t| match t { ( _, ip, _) => ip } )
338342 } ;
339343 p. read_or ( & mut [ ipv4_p, ipv6_p] )
340344 } ;
341- let colon = |p : & mut Parser | p. read_given_char ( ':' ) ;
342- let port = |p : & mut Parser | p. read_number ( 10 , 5 , 0x10000 ) . map ( |n| n as u16 ) ;
345+ let colon = |& : p: & mut Parser | p. read_given_char ( ':' ) ;
346+ let port = |& : p: & mut Parser | p. read_number ( 10 , 5 , 0x10000 ) . map ( |n| n as u16 ) ;
343347
344348 // host, colon, port
345- self . read_seq_3 :: < IpAddr , char , u16 > ( ip_addr, colon, port)
349+ self . read_seq_3 :: < IpAddr , char , u16 , _ , _ , _ > ( ip_addr, colon, port)
346350 . map ( |t| match t { ( ip, _, port) => SocketAddr { ip : ip, port : port } } )
347351 }
348352}
0 commit comments