@@ -222,28 +222,34 @@ module private JavaPropertiesFile =
222222 | KeyValue of key : string * value : string
223223
224224 module private Parser =
225- type CharReader = unit -> char option
225+ type CharReader = unit -> char voption
226226
227+ [<return : Struct>]
227228 let inline (| IsWhitespace | _ |) c =
228229 match c with
229- | Some c -> if c = ' ' || c = '\t' || c = '\u00ff' then Some c else None
230- | None -> None
230+ | ValueSome c ->
231+ if c = ' ' || c = '\t' || c = '\u00ff' then
232+ ValueSome c
233+ else
234+ ValueNone
235+ | ValueNone -> ValueNone
231236
232237 type IsEof =
233238 | Yes = 1 y
234239 | No = 0 y
235240
236- let rec readToFirstChar ( c : char option ) ( reader : CharReader ) =
241+ let rec readToFirstChar ( c : char voption ) ( reader : CharReader ) =
237242 match c with
238243 | IsWhitespace _ -> readToFirstChar ( reader ()) reader
239- | Some '\r'
240- | Some '\n' -> None , IsEof.No
241- | Some _ -> c, IsEof.No
242- | None -> None , IsEof.Yes
244+ | ValueSome '\r'
245+ | ValueSome '\n' -> ValueNone , IsEof.No
246+ | ValueSome _ -> c, IsEof.No
247+ | ValueNone -> ValueNone , IsEof.Yes
243248
249+ [<return : Struct>]
244250 let inline (| EscapeSequence | _ |) c =
245251 match c with
246- | Some c ->
252+ | ValueSome c ->
247253 if
248254 c = 'r'
249255 || c = 'n'
@@ -254,10 +260,10 @@ module private JavaPropertiesFile =
254260 || c = '''
255261 || c = '\\'
256262 then
257- Some c
263+ ValueSome c
258264 else
259- None
260- | None -> None
265+ ValueNone
266+ | ValueNone -> ValueNone
261267
262268 let inline isHex c =
263269 ( c >= '0' && c <= '9' ) || ( c >= 'A' && c <= 'F' ) || ( c >= 'a' && c <= 'f' )
@@ -270,7 +276,9 @@ module private JavaPropertiesFile =
270276 | 't' -> '\t'
271277 | 'u' ->
272278 match reader (), reader (), reader (), reader () with
273- | Some c1, Some c2, Some c3, Some c4 when isHex c1 && isHex c2 && isHex c3 && isHex c4 ->
279+ | ValueSome c1, ValueSome c2, ValueSome c3, ValueSome c4 when
280+ isHex c1 && isHex c2 && isHex c3 && isHex c4
281+ ->
274282 let hex = String([| c1; c2; c3; c4 |])
275283
276284 let value =
@@ -280,89 +288,89 @@ module private JavaPropertiesFile =
280288 | _ -> failwith " Invalid unicode escape"
281289 | _ -> c
282290
283- let inline readKey ( c : char option ) ( reader : CharReader ) ( buffer : StringBuilder ) =
291+ let inline readKey ( c : char voption ) ( reader : CharReader ) ( buffer : StringBuilder ) =
284292 let rec recurseEnd ( result : string ) =
285293 match reader () with
286- | Some ':'
287- | Some '='
294+ | ValueSome ':'
295+ | ValueSome '='
288296 | IsWhitespace _ -> recurseEnd result
289- | Some '\r'
290- | Some '\n' -> result, false , None , IsEof.No
291- | None -> result, false , None , IsEof.Yes
292- | Some c -> result, true , Some c, IsEof.No
297+ | ValueSome '\r'
298+ | ValueSome '\n' -> result, false , ValueNone , IsEof.No
299+ | ValueNone -> result, false , ValueNone , IsEof.Yes
300+ | ValueSome c -> result, true , ValueSome c, IsEof.No
293301
294- let rec recurse ( c : char option ) ( buffer : StringBuilder ) ( escaping : bool ) =
302+ let rec recurse ( c : char voption ) ( buffer : StringBuilder ) ( escaping : bool ) =
295303 match c with
296304 | EscapeSequence c when escaping ->
297305 let realChar = readEscapeSequence c reader
298306 recurse ( reader ()) ( buffer.Append( realChar)) false
299- | Some ' ' -> recurseEnd ( buffer.ToString())
300- | Some ':'
301- | Some '=' when not escaping -> recurseEnd ( buffer.ToString())
302- | Some '\r'
303- | Some '\n' -> buffer.ToString(), false , None , IsEof.No
304- | None -> buffer.ToString(), false , None , IsEof.Yes
305- | Some '\\' -> recurse ( reader ()) buffer true
306- | Some c -> recurse ( reader ()) ( buffer.Append( c)) false
307+ | ValueSome ' ' -> recurseEnd ( buffer.ToString())
308+ | ValueSome ':'
309+ | ValueSome '=' when not escaping -> recurseEnd ( buffer.ToString())
310+ | ValueSome '\r'
311+ | ValueSome '\n' -> buffer.ToString(), false , ValueNone , IsEof.No
312+ | ValueNone -> buffer.ToString(), false , ValueNone , IsEof.Yes
313+ | ValueSome '\\' -> recurse ( reader ()) buffer true
314+ | ValueSome c -> recurse ( reader ()) ( buffer.Append( c)) false
307315
308316 recurse c buffer false
309317
310318 let rec readComment ( reader : CharReader ) ( buffer : StringBuilder ) =
311319 match reader () with
312- | Some '\r'
313- | Some '\n' -> Some( Comment( buffer.ToString())), IsEof.No
314- | None -> Some( Comment( buffer.ToString())), IsEof.Yes
315- | Some c -> readComment reader ( buffer.Append( c))
320+ | ValueSome '\r'
321+ | ValueSome '\n' -> Some( Comment( buffer.ToString())), IsEof.No
322+ | ValueNone -> Some( Comment( buffer.ToString())), IsEof.Yes
323+ | ValueSome c -> readComment reader ( buffer.Append( c))
316324
317- let inline readValue ( c : char option ) ( reader : CharReader ) ( buffer : StringBuilder ) =
318- let rec recurse ( c : char option ) ( buffer : StringBuilder ) ( escaping : bool ) ( cr : bool ) ( lineStart : bool ) =
325+ let inline readValue ( c : char voption ) ( reader : CharReader ) ( buffer : StringBuilder ) =
326+ let rec recurse ( c : char voption ) ( buffer : StringBuilder ) ( escaping : bool ) ( cr : bool ) ( lineStart : bool ) =
319327 match c with
320328 | EscapeSequence c when escaping ->
321329 let realChar = readEscapeSequence c reader
322330 recurse ( reader ()) ( buffer.Append( realChar)) false false false
323- | Some '\r'
324- | Some '\n' ->
325- if escaping || ( cr && c = Some '\n' ) then
326- recurse ( reader ()) buffer false ( c = Some '\r' ) true
331+ | ValueSome '\r'
332+ | ValueSome '\n' ->
333+ if escaping || ( cr && c = ValueSome '\n' ) then
334+ recurse ( reader ()) buffer false ( c = ValueSome '\r' ) true
327335 else
328336 buffer.ToString(), IsEof.No
329- | None -> buffer.ToString(), IsEof.Yes
330- | Some _ when lineStart ->
337+ | ValueNone -> buffer.ToString(), IsEof.Yes
338+ | ValueSome _ when lineStart ->
331339 let firstChar , _ = readToFirstChar c reader
332340 recurse firstChar buffer false false false
333- | Some '\\' -> recurse ( reader ()) buffer true false false
334- | Some c -> recurse ( reader ()) ( buffer.Append( c)) false false false
341+ | ValueSome '\\' -> recurse ( reader ()) buffer true false false
342+ | ValueSome c -> recurse ( reader ()) ( buffer.Append( c)) false false false
335343
336344 recurse c buffer false false true
337345
338346 let rec readLine ( reader : CharReader ) ( buffer : StringBuilder ) =
339347 match readToFirstChar ( reader ()) reader with
340- | Some '#' , _
341- | Some '!' , _ -> readComment reader ( buffer.Clear())
342- | Some firstChar, _ ->
343- let key , hasValue , c , isEof = readKey ( Some firstChar) reader ( buffer.Clear())
348+ | ValueSome '#' , _
349+ | ValueSome '!' , _ -> readComment reader ( buffer.Clear())
350+ | ValueSome firstChar, _ ->
351+ let key , hasValue , c , isEof = readKey ( ValueSome firstChar) reader ( buffer.Clear())
344352
345353 let value , isEof =
346354 if hasValue then
347355 // We know that we aren't at the end of the buffer, but readKey can return None if it didn't need the next char
348356 let firstChar =
349357 match c with
350- | Some c -> Some c
351- | None -> reader ()
358+ | ValueSome c -> ValueSome c
359+ | ValueNone -> reader ()
352360
353361 readValue firstChar reader ( buffer.Clear())
354362 else
355363 " " , isEof
356364
357365 Some( KeyValue( key, value)), isEof
358- | None , isEof -> None, isEof
366+ | ValueNone , isEof -> None, isEof
359367
360368 let inline textReaderToReader ( reader : TextReader ) =
361369 let buffer = [| '\u0000' |]
362370
363371 fun () ->
364372 let eof = reader.Read( buffer, 0 , 1 ) = 0
365- if eof then None else Some ( buffer[ 0 ])
373+ if eof then ValueNone else ValueSome ( buffer[ 0 ])
366374
367375 let parseWithReader reader =
368376 let buffer = StringBuilder( 255 )
0 commit comments