From 61601ea3a77b8d619be6f06a35cf36c86bfab947 Mon Sep 17 00:00:00 2001 From: Steven Shaw Date: Fri, 16 Jun 2017 20:34:50 +1000 Subject: [PATCH] Fix `slowString`. Still slow though :) --- haskell/nix-derivation-parser/parser.hs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/haskell/nix-derivation-parser/parser.hs b/haskell/nix-derivation-parser/parser.hs index 455eaf10..99c8b0d4 100644 --- a/haskell/nix-derivation-parser/parser.hs +++ b/haskell/nix-derivation-parser/parser.hs @@ -89,15 +89,24 @@ mapOf keyValue = do slowString :: Parser Text slowString = do void "\"" - s <- Data.Attoparsec.Text.Lazy.many1 char + s <- Data.Attoparsec.Text.Lazy.many' char void "\"" pure $ T.pack s char :: Parser Char -char = do - void "\""; Data.Attoparsec.Text.Lazy.anyChar <|> - let notQuoteOrBackslash c = c /= '"' && c /= '\\' - in Data.Attoparsec.Text.Lazy.satisfy notQuoteOrBackslash +char = backSlashed <|> notBackslashed + where + backSlashed = do + void "\\" + c <- Data.Attoparsec.Text.Lazy.anyChar + pure $ case c of + 'n' -> '\n' + 'r' -> '\r' + 't' -> '\t' + _ -> c + notBackslashed = + let notQuoteOrBackslash c = c /= '"' && c /= '\\' + in Data.Attoparsec.Text.Lazy.satisfy notQuoteOrBackslash -- | -- Faster string parser. Should be good with Attoparsec. @@ -125,7 +134,7 @@ fastString = do return $ Data.Text.Lazy.toStrict text string :: Parser Text -string = if False then slowString else fastString +string = if True then slowString else fastString filePath :: Parser FilePath filePath = do