Skip to content

Commit ef1fb7b

Browse files
committed
improve performance of code unit string parser
1 parent 18e85ed commit ef1fb7b

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

bench/Main.purs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
-- | This benchmark suite is intended to guide changes to this package so that
66
-- | we can compare the benchmarks of different commits.
77

8-
98
module Bench.Main where
109

1110
import Prelude
@@ -54,21 +53,21 @@ main = do
5453
-- log $ show $ runParser stringSkidoo_2 parseSkidoo
5554
-- log $ show $ Regex.match patternSkidoo stringSkidoo_2
5655
log "StringParser.runParser parse23DigitPoints"
57-
benchWith 20
56+
benchWith 200
5857
$ \_ -> runParser parse23DigitPoints string23_10000
5958
log "StringParser.runParser parse23DigitUnits"
6059
benchWith 200
6160
$ \_ -> runParser parse23DigitUnits string23_10000
6261

6362
log "StringParser.runParser parse23StringPoints"
64-
benchWith 20
63+
benchWith 200
6564
$ \_ -> runParser parse23StringPoints string23_10000
6665
log "StringParser.runParser parse23StringUnits"
6766
benchWith 200
6867
$ \_ -> runParser parse23StringUnits string23_10000
6968

7069
log "StringParser.runParser parse23RegexPoints"
71-
benchWith 20
70+
benchWith 200
7271
$ \_ -> runParser parse23RegexPoints string23_10000
7372
log "StringParser.runParser parse23RegexUnits"
7473
benchWith 200

src/Text/Parsing/StringParser/CodeUnits.purs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import Data.Foldable (class Foldable, foldMap, elem, notElem)
3232
import Data.Maybe (Maybe(..))
3333
import Data.String.CodeUnits (charAt, singleton)
3434
import Data.String.CodeUnits as SCU
35-
import Data.String.Pattern (Pattern(..))
3635
import Data.String.Regex as Regex
3736
import Data.String.Regex.Flags (noFlags)
3837
import Text.Parsing.StringParser (Parser(..), try, fail)
@@ -61,10 +60,13 @@ anyDigit = try do
6160

6261
-- | Match the specified string.
6362
string :: String -> Parser String
64-
string nt = Parser \s ->
65-
case s of
66-
{ substr, posFromStart } | SCU.indexOf (Pattern nt) substr == Just 0 -> Right { result: nt, suffix: { substr: SCU.drop (SCU.length nt) substr, posFromStart: posFromStart + SCU.length nt } }
67-
{ posFromStart } -> Left { pos: posFromStart, error: "Expected '" <> nt <> "'." }
63+
string pattern = Parser \{ substr, posFromStart } ->
64+
let
65+
length = SCU.length pattern
66+
{ before, after } = SCU.splitAt length substr
67+
in
68+
if before == pattern then Right { result: pattern, suffix: { substr: after, posFromStart: posFromStart + length } }
69+
else Left { pos: posFromStart, error: "Expected '" <> pattern <> "'." }
6870

6971
-- | Match a character satisfying the given predicate.
7072
satisfy :: (Char -> Boolean) -> Parser Char

0 commit comments

Comments
 (0)