@@ -76,47 +76,66 @@ module Strings =
7676 Pluralizer.toSingular noun
7777
7878 // Active patterns & operators for parsing strings
79- let (@?) ( s : string ) i = if i >= s.Length then ValueNone else ValueSome s.[ i]
79+ let (@?) ( s : string ) i = if i >= s.Length then None else Some s.[ i]
8080
81- let inline satisfies predicate ( charOption : voption < char >) =
81+ let inline satisfies predicate ( charOption : option < char >) =
8282 match charOption with
83- | ValueSome c when predicate c -> charOption
84- | _ -> ValueNone
83+ | Some c when predicate c -> charOption
84+ | _ -> None
8585
86- [<return : Struct>]
8786 let (| EOF | _ |) = function
88- | ValueSome _ -> ValueNone
89- | _ -> ValueSome ()
90- [< return : Struct>]
87+ | Some _ -> None
88+ | _ -> Some ()
89+
9190 let (| LetterDigit | _ |) = satisfies Char.IsLetterOrDigit
92- [<return : Struct>]
9391 let (| Upper | _ |) = satisfies Char.IsUpper
94- [<return : Struct>]
9592 let (| Lower | _ |) = satisfies Char.IsLower
9693
94+ /// Faster patterns with ValueOption instead of Option
95+ [<RequireQualifiedAccess>]
96+ module ValuePatterns =
97+ // Active patterns & operators for parsing strings
98+ let inline take ( s : string ) i = if i >= s.Length then ValueNone else ValueSome s.[ i]
99+
100+ let inline internal satisfies predicate ( charOption : voption < char >) =
101+ match charOption with
102+ | ValueSome c when predicate c -> charOption
103+ | _ -> ValueNone
104+
105+ [<return : Struct>]
106+ let (| EOF | _ |) = function
107+ | ValueSome _ -> ValueNone
108+ | _ -> ValueSome ()
109+ [<return : Struct>]
110+ let (| LetterDigit | _ |) = satisfies Char.IsLetterOrDigit
111+ [<return : Struct>]
112+ let (| Upper | _ |) = satisfies Char.IsUpper
113+ [<return : Struct>]
114+ let (| Lower | _ |) = satisfies Char.IsLower
115+
97116 /// Turns a string into a nice PascalCase identifier
98117 [<CompiledName( " NiceName" ) >]
99118 let niceName ( s : string ) =
100119 if s = s.ToUpper() then s else
101120 // Starting to parse a new segment
102121 let rec restart i =
103- match s @? i with
104- | EOF -> Seq.empty
105- | LetterDigit _ & Upper _ -> upperStart i ( i + 1 )
106- | LetterDigit _ -> consume i false ( i + 1 )
122+ match ValuePatterns.take s i with
123+ | ValuePatterns. EOF -> Seq.empty
124+ | ValuePatterns. LetterDigit _ & ValuePatterns. Upper _ -> upperStart i ( i + 1 )
125+ | ValuePatterns. LetterDigit _ -> consume i false ( i + 1 )
107126 | _ -> restart ( i + 1 )
108127
109128 // Parsed first upper case letter, continue either all lower or all upper
110129 and upperStart from i =
111- match s @? i with
112- | Upper _ -> consume from true ( i + 1 )
113- | Lower _ -> consume from false ( i + 1 )
130+ match ValuePatterns.take s i with
131+ | ValuePatterns. Upper _ -> consume from true ( i + 1 )
132+ | ValuePatterns. Lower _ -> consume from false ( i + 1 )
114133 | _ -> restart ( i + 1 )
115134 // Consume are letters of the same kind (either all lower or all upper)
116135 and consume from takeUpper i =
117- match s @? i with
118- | Lower _ when not takeUpper -> consume from takeUpper ( i + 1 )
119- | Upper _ when takeUpper -> consume from takeUpper ( i + 1 )
136+ match ValuePatterns.take s i with
137+ | ValuePatterns. Lower _ when not takeUpper -> consume from takeUpper ( i + 1 )
138+ | ValuePatterns. Upper _ when takeUpper -> consume from takeUpper ( i + 1 )
120139 | _ ->
121140 let r1 = struct ( from, i)
122141 let r2 = restart i
0 commit comments