@@ -76,47 +76,66 @@ module Strings =
76
76
Pluralizer.toSingular noun
77
77
78
78
// 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]
80
80
81
- let inline satisfies predicate ( charOption : voption < char >) =
81
+ let inline satisfies predicate ( charOption : option < char >) =
82
82
match charOption with
83
- | ValueSome c when predicate c -> charOption
84
- | _ -> ValueNone
83
+ | Some c when predicate c -> charOption
84
+ | _ -> None
85
85
86
- [<return : Struct>]
87
86
let (| EOF | _ |) = function
88
- | ValueSome _ -> ValueNone
89
- | _ -> ValueSome ()
90
- [< return : Struct>]
87
+ | Some _ -> None
88
+ | _ -> Some ()
89
+
91
90
let (| LetterDigit | _ |) = satisfies Char.IsLetterOrDigit
92
- [<return : Struct>]
93
91
let (| Upper | _ |) = satisfies Char.IsUpper
94
- [<return : Struct>]
95
92
let (| Lower | _ |) = satisfies Char.IsLower
96
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
+
97
116
/// Turns a string into a nice PascalCase identifier
98
117
[<CompiledName( " NiceName" ) >]
99
118
let niceName ( s : string ) =
100
119
if s = s.ToUpper() then s else
101
120
// Starting to parse a new segment
102
121
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 )
107
126
| _ -> restart ( i + 1 )
108
127
109
128
// Parsed first upper case letter, continue either all lower or all upper
110
129
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 )
114
133
| _ -> restart ( i + 1 )
115
134
// Consume are letters of the same kind (either all lower or all upper)
116
135
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 )
120
139
| _ ->
121
140
let r1 = struct ( from, i)
122
141
let r2 = restart i
0 commit comments