@@ -16,6 +16,7 @@ import Control.Alt ((<|>))
1616import Data.Array as A
1717import Data.Foldable as F
1818import Data.HugeNum as HN
19+ import Data.HugeInt as HI
1920import Data.Int as Int
2021import Data.Json.Extended.Signature.Core (EJsonF (..), EJsonMap (..))
2122import Data.List as L
@@ -105,12 +106,14 @@ parse1000
105106 tens x y = x * 10 + y
106107
107108parseNat
108- ∷ ∀ m
109+ ∷ ∀ m n
109110 . Monad m
110- ⇒ P.ParserT String m Int
111- parseNat =
112- A .some parseDigit
113- <#> F .foldl (\a i → a * 10 + i) 0
111+ ⇒ Semiring n
112+ ⇒ n
113+ → (Int → n )
114+ → P.ParserT String m n
115+ parseNat ten digit =
116+ F .foldl (\a i → a * ten + digit i) zero <$> A .some parseDigit
114117
115118parseNegative
116119 ∷ ∀ m a
@@ -158,7 +161,7 @@ parsePositiveScientific
158161 ⇒ P.ParserT String m HN.HugeNum
159162parsePositiveScientific = do
160163 let ten = HN .fromNumber 10.0
161- lhs ← PC .try $ fromInt <$> parseNat <* PS .string " ."
164+ lhs ← PC .try $ parseNat ten fromInt <* PS .string " ."
162165 rhs ← A .many parseDigit <#> F .foldr (\d f → divNum (f + fromInt d) ten) zero
163166 exp ← parseExponent
164167 pure $ (lhs + rhs) * HN .pow ten exp
@@ -171,7 +174,6 @@ parsePositiveScientific = do
171174 HN .fromNumber $
172175 HN .toNumber a / HN .toNumber b
173176
174-
175177parseHugeNum
176178 ∷ ∀ m
177179 . Monad m
@@ -202,8 +204,11 @@ parseBooleanLiteral =
202204parseDecimalLiteral ∷ ∀ m . Monad m ⇒ P.ParserT String m HN.HugeNum
203205parseDecimalLiteral = parseHugeNum <|> parseScientific
204206
207+ parseHugeIntLiteral ∷ ∀ m . Monad m ⇒ P.ParserT String m HI.HugeInt
208+ parseHugeIntLiteral = parseSigned (parseNat (HI .fromInt 10 ) HI .fromInt)
209+
205210parseIntLiteral ∷ ∀ m . Monad m ⇒ P.ParserT String m Int
206- parseIntLiteral = parseSigned parseNat
211+ parseIntLiteral = parseSigned ( parseNat 10 id)
207212
208213parseStringLiteral ∷ ∀ m . Monad m ⇒ P.ParserT String m String
209214parseStringLiteral = quoted stringInner
@@ -226,11 +231,11 @@ parseEJsonF
226231 ⇒ P.ParserT String m a
227232 → P.ParserT String m (EJsonF a )
228233parseEJsonF rec =
229- PC .choice $
234+ PC .choice
230235 [ Null <$ parseNull
231236 , Boolean <$> parseBooleanLiteral
232237 , Decimal <$> PC .try parseDecimalLiteral
233- , Integer <$> parseIntLiteral
238+ , Integer <$> parseHugeIntLiteral
234239 , String <$> parseStringLiteral
235240 , Array <$> parseArrayLiteral rec
236241 , Map <$> parseMapLiteral rec
0 commit comments