@@ -22,6 +22,7 @@ use kinds::Copy;
22
22
use io:: { mod, IoResult , IoError } ;
23
23
use io:: net;
24
24
use iter:: { Iterator , IteratorExt } ;
25
+ use ops:: FnOnce ;
25
26
use option:: Option ;
26
27
use option:: Option :: { None , Some } ;
27
28
use result:: Result :: { Ok , Err } ;
@@ -100,8 +101,9 @@ impl<'a> Parser<'a> {
100
101
}
101
102
102
103
// 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
+ {
105
107
let pos = self . pos ;
106
108
let r = cb ( self ) ;
107
109
if r. is_none ( ) {
@@ -111,9 +113,10 @@ impl<'a> Parser<'a> {
111
113
}
112
114
113
115
// 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| {
117
120
match cb ( p) {
118
121
Some ( x) => if p. is_eof ( ) { Some ( x) } else { None } ,
119
122
None => None ,
@@ -134,15 +137,16 @@ impl<'a> Parser<'a> {
134
137
}
135
138
136
139
// 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| {
146
150
let a = pa ( p) ;
147
151
let b = if a. is_some ( ) { pb ( p) } else { None } ;
148
152
let c = if b. is_some ( ) { pc ( p) } else { None } ;
@@ -327,22 +331,22 @@ impl<'a> Parser<'a> {
327
331
}
328
332
329
333
fn read_socket_addr ( & mut self ) -> Option < SocketAddr > {
330
- let ip_addr = |p : & mut Parser | {
334
+ let ip_addr = |& : p: & mut Parser | {
331
335
let ipv4_p = |p : & mut Parser | p. read_ip_addr ( ) ;
332
336
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)
337
341
. map ( |t| match t { ( _, ip, _) => ip } )
338
342
} ;
339
343
p. read_or ( & mut [ ipv4_p, ipv6_p] )
340
344
} ;
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 ) ;
343
347
344
348
// 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)
346
350
. map ( |t| match t { ( ip, _, port) => SocketAddr { ip : ip, port : port } } )
347
351
}
348
352
}
0 commit comments