on master help sign in
Some nice speedups for parsing floats
42afc09Bryan O'Sullivan
Data/Text/Lex.hs+3−2
@@ -107,7 +107,7 @@ signa :: Num a => Parser a -> Parser a
107{-# SPECIALIZE signa :: Parser Int -> Parser Int #-}
107{-# SPECIALIZE signa :: Parser Int -> Parser Int #-}
108{-# SPECIALIZE signa :: Parser Integer -> Parser Integer #-}
108{-# SPECIALIZE signa :: Parser Integer -> Parser Integer #-}
109signa p = do
109signa p = do
110− sign <- perhaps '+' $ char (`elem` "-+")
110+ sign <- perhaps '+' $ char (\c -> c == '-' || c == '+')
111 if sign == '+' then p else negate `liftM` p
111 if sign == '+' then p else negate `liftM` p
112
112
113newtype Parser a = P {
113newtype Parser a = P {
@@ -142,7 +142,8 @@ floaty f = runP $ do
142 digits <- P $ \t -> Right (T.length $ T.takeWhile isDigit t, t)
142 digits <- P $ \t -> Right (T.length $ T.takeWhile isDigit t, t)
143 n <- P decimal
143 n <- P decimal
144 return (n, digits)
144 return (n, digits)
145+ let e c = c == 'e' || c == 'E'
145− power <- perhaps 0 (char (`elem` "eE") >> signa (P decimal) :: Parser Int)
146+ power <- perhaps 0 (char e >> signa (P decimal) :: Parser Int)
146 return $! if fracDigits == 0
147 return $! if fracDigits == 0
147 then if power == 0
148 then if power == 0
148 then fromIntegral real
149 then fromIntegral real