@@ -91,31 +91,54 @@ module Strings =
91
91
let (| Upper | _ |) = satisfies Char.IsUpper
92
92
let (| Lower | _ |) = satisfies Char.IsLower
93
93
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
+
94
116
/// Turns a string into a nice PascalCase identifier
95
117
[<CompiledName( " NiceName" ) >]
96
118
let niceName ( s : string ) =
97
119
if s = s.ToUpper() then s else
98
120
// Starting to parse a new segment
99
- let rec restart i = seq {
100
- match s @? i with
101
- | EOF -> ()
102
- | LetterDigit _ & Upper _ -> yield ! upperStart i ( i + 1 )
103
- | LetterDigit _ -> yield ! consume i false ( i + 1 )
104
- | _ -> yield ! restart ( i + 1 ) }
121
+ let rec restart i =
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 )
126
+ | _ -> restart ( i + 1 )
105
127
106
128
// Parsed first upper case letter, continue either all lower or all upper
107
- and upperStart from i = seq {
108
- match s @? i with
109
- | Upper _ -> yield ! consume from true ( i + 1 )
110
- | Lower _ -> yield ! consume from false ( i + 1 )
111
- | _ -> yield ! restart ( i + 1 ) }
129
+ and upperStart from i =
130
+ match ValuePatterns.take s i with
131
+ | ValuePatterns. Upper _ -> consume from true ( i + 1 )
132
+ | ValuePatterns. Lower _ -> consume from false ( i + 1 )
133
+ | _ -> restart ( i + 1 )
112
134
// Consume are letters of the same kind (either all lower or all upper)
113
- and consume from takeUpper i = seq {
114
- match s @? i with
115
- | Lower _ when not takeUpper -> yield ! consume from takeUpper ( i + 1 )
116
- | Upper _ when takeUpper -> yield ! consume from takeUpper ( i + 1 )
135
+ and consume from takeUpper i =
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 )
117
139
| _ ->
118
- yield from, i
140
+ seq {
141
+ yield struct ( from, i)
119
142
yield ! restart i }
120
143
121
144
// Split string into segments and turn them to PascalCase
0 commit comments