Skip to content

Commit a1815a8

Browse files
committed
moved ValueOption matching under ValuePatterns
1 parent a616295 commit a1815a8

File tree

1 file changed

+39
-20
lines changed

1 file changed

+39
-20
lines changed

src/FSharpx.Extras/Strings.fs

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)