@@ -133,15 +133,17 @@ char p = P $ \t -> case T.uncons t of
133 Just (c,t') | p c -> Right (c,t')
133 Just (c,t') | p c -> Right (c,t')
134 _ -> Left "char"
134 _ -> Left "char"
136+data T = T !Integer !Int
136floaty :: RealFloat a => (Integer -> Integer -> Integer -> a) -> Lexer a
138floaty :: RealFloat a => (Integer -> Integer -> Integer -> a) -> Lexer a
137{-# INLINE floaty #-}
139{-# INLINE floaty #-}
138floaty f = runP $ do
140floaty f = runP $ do
139 real <- signa (P decimal)
141 real <- signa (P decimal)
140− (fraction,fracDigits) <- perhaps (0,0) $ do
142+ T fraction fracDigits <- perhaps (T 0 0) $ do
141 _ <- char (=='.')
143 _ <- char (=='.')
142 digits <- P $ \t -> Right (T.length $ T.takeWhile isDigit t, t)
144 digits <- P $ \t -> Right (T.length $ T.takeWhile isDigit t, t)
143 n <- P decimal
145 n <- P decimal
144− return (n, digits)
146+ return $ T n digits
145 let e c = c == 'e' || c == 'E'
147 let e c = c == 'e' || c == 'E'
146 power <- perhaps 0 (char e >> signa (P decimal) :: Parser Int)
148 power <- perhaps 0 (char e >> signa (P decimal) :: Parser Int)
147 return $! if fracDigits == 0
149 return $! if fracDigits == 0