Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit d373a85

Browse files
committed
Use HugeInt for Integer
1 parent d252fc3 commit d373a85

6 files changed

Lines changed: 52 additions & 37 deletions

File tree

src/Data/Json/Extended.purs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,25 @@ module Data.Json.Extended
3232
import Prelude hiding (map)
3333

3434
import Control.Lazy as Lazy
35-
3635
import Data.Argonaut as JS
3736
import Data.Bitraversable (bitraverse)
3837
import Data.Either as E
3938
import Data.Functor as F
4039
import Data.Functor.Mu as Mu
40+
import Data.HugeInt as HI
4141
import Data.HugeNum as HN
4242
import Data.Json.Extended.Signature as Sig
43+
import Data.Json.Extended.Signature hiding (getType) as Exports
4344
import Data.Json.Extended.Type (EJsonType)
4445
import Data.Lens (Prism', preview, prism')
4546
import Data.Map as Map
4647
import Data.Maybe as M
4748
import Data.StrMap as SM
4849
import Data.Traversable (for)
4950
import Data.Tuple as T
50-
import Data.Json.Extended.Signature hiding (getType) as Exports
51-
5251
import Matryoshka (class Corecursive, class Recursive, anaM, cata, embed, project)
53-
54-
import Test.StrongCheck.Gen as Gen
52+
import Control.Monad.Gen (class MonadGen)
53+
import Control.Monad.Rec.Class (class MonadRec)
5554
import Text.Parsing.Parser as P
5655

5756
type EJson = Mu.Mu Sig.EJsonF
@@ -62,7 +61,13 @@ decodeEJson = anaM Sig.decodeJsonEJsonF
6261
encodeEJson t. Recursive t Sig.EJsonF t JS.Json
6362
encodeEJson = cata Sig.encodeJsonEJsonF
6463

65-
arbitraryEJsonOfSize t. Corecursive t Sig.EJsonF Gen.Size Gen.Gen t
64+
arbitraryEJsonOfSize
65+
m t
66+
. MonadGen m
67+
MonadRec m
68+
Corecursive t Sig.EJsonF
69+
Int
70+
m t
6671
arbitraryEJsonOfSize = anaM Sig.arbitraryEJsonF
6772

6873
renderEJson t. Recursive t Sig.EJsonF t String
@@ -78,7 +83,7 @@ null = embed Sig.Null
7883
boolean t. Corecursive t Sig.EJsonF Boolean t
7984
boolean = embed <<< Sig.Boolean
8085

81-
integer t. Corecursive t Sig.EJsonF Int t
86+
integer t. Corecursive t Sig.EJsonF HI.HugeInt t
8287
integer = embed <<< Sig.Integer
8388

8489
decimal t. Corecursive t Sig.EJsonF HN.HugeNum t
@@ -116,7 +121,7 @@ _Boolean = prism' boolean $ project >>> case _ of
116121
Sig.Boolean b → M.Just b
117122
_ → M.Nothing
118123

119-
_Integer t. Corecursive t Sig.EJsonF Recursive t Sig.EJsonF Prism' t Int
124+
_Integer t. Corecursive t Sig.EJsonF Recursive t Sig.EJsonF Prism' t HI.HugeInt
120125
_Integer = prism' integer $ project >>> case _ of
121126
Sig.Integer i → M.Just i
122127
_ → M.Nothing

src/Data/Json/Extended/Signature/Core.purs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Data.Bifunctor as BF
1010
import Data.Eq (class Eq1)
1111
import Data.Foldable as F
1212
import Data.HugeNum as HN
13+
import Data.HugeInt as HI
1314
import Data.Json.Extended.Type as JT
1415
import Data.List as L
1516
import Data.Map as M
@@ -25,7 +26,7 @@ data EJsonF a
2526
= Null
2627
| String String
2728
| Boolean Boolean
28-
| Integer Int
29+
| Integer HI.HugeInt
2930
| Decimal HN.HugeNum
3031
| Array (Array a)
3132
| Map (EJsonMap a)

src/Data/Json/Extended/Signature/Gen.purs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,29 @@ module Data.Json.Extended.Signature.Gen
44

55
import Prelude
66

7+
import Control.Monad.Gen (class MonadGen)
8+
import Control.Monad.Gen as Gen
9+
import Control.Monad.Rec.Class (class MonadRec)
710
import Data.Array as A
11+
import Data.HugeInt as HI
812
import Data.HugeNum as HN
913
import Data.Json.Extended.Signature.Core (EJsonF(..), EJsonMap(..))
14+
import Data.NonEmpty ((:|))
15+
import Data.String.Gen as GenS
1016
import Data.Tuple as T
11-
1217
import Matryoshka (CoalgebraM)
1318

14-
import Test.StrongCheck.Arbitrary as SC
15-
import Test.StrongCheck.Gen as Gen
16-
17-
arbitraryEJsonF CoalgebraM Gen.Gen EJsonF Int
19+
arbitraryEJsonF m. MonadGen m MonadRec m CoalgebraM m EJsonF Int
1820
arbitraryEJsonF 0 =
19-
Gen.oneOf (pure Null)
20-
[ map Boolean SC.arbitrary
21-
, map Integer SC.arbitrary
22-
, map Decimal $ map HN.fromNumber SC.arbitrary
23-
, map String SC.arbitrary
21+
Gen.oneOf $ pure Null :|
22+
[ Boolean <$> Gen.chooseBool
23+
, Integer <<< HI.fromInt <$> Gen.chooseInt (-1000000) 1000000
24+
, Decimal <<< HN.fromNumber <$> Gen.chooseFloat (-1000000.0) 1000000.0
25+
, String <$> GenS.genUnicodeString
2426
]
2527
arbitraryEJsonF n = do
2628
len ← Gen.chooseInt 0 $ n - 1
27-
Gen.oneOf (arbitraryEJsonF 0)
29+
Gen.oneOf $ arbitraryEJsonF 0 :|
2830
[ pure $ Array $ A.replicate len $ n - 1
2931
, pure $ Map $ EJsonMap $ A.replicate len $ T.Tuple (n - 1) (n - 1)
3032
]

src/Data/Json/Extended/Signature/Json.purs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,25 @@ module Data.Json.Extended.Signature.Json where
33
import Prelude
44

55
import Control.Alt ((<|>))
6-
76
import Data.Argonaut.Core as JS
87
import Data.Argonaut.Decode (class DecodeJson, decodeJson, (.?))
98
import Data.Argonaut.Encode (encodeJson)
109
import Data.Bifunctor (lmap)
1110
import Data.Either as E
11+
import Data.HugeInt as HI
1212
import Data.HugeNum as HN
1313
import Data.Int as Int
1414
import Data.Json.Extended.Signature.Core (EJsonF(..), EJsonMap(..))
1515
import Data.Maybe as M
1616
import Data.StrMap as SM
1717
import Data.Traversable as TR
18-
1918
import Matryoshka (Algebra, CoalgebraM)
2019

2120
encodeJsonEJsonF Algebra EJsonF JS.Json
2221
encodeJsonEJsonF = case _ of
2322
NullJS.jsonNull
2423
Boolean b → encodeJson b
25-
Integer i → encodeJson i
24+
Integer i → encodeJson $ HN.toNumber $ HI.toHugeNum i -- TODO: bug in HI.toInt
2625
Decimal a → encodeJson $ HN.toNumber a
2726
String str → encodeJson str
2827
Array xs → encodeJson xs
@@ -40,7 +39,7 @@ decodeJsonEJsonF =
4039
where
4140
decodeNumber Number EJsonF JS.Json
4241
decodeNumber a = case Int.fromNumber a of
43-
M.Just i → Integer i
42+
M.Just i → Integer $ HI.fromInt i
4443
M.NothingDecimal $ HN.fromNumber a
4544

4645
decodeArray JS.JArray E.Either String (EJsonF JS.Json)

src/Data/Json/Extended/Signature/Parse.purs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import Control.Alt ((<|>))
1616
import Data.Array as A
1717
import Data.Foldable as F
1818
import Data.HugeNum as HN
19+
import Data.HugeInt as HI
1920
import Data.Int as Int
2021
import Data.Json.Extended.Signature.Core (EJsonF(..), EJsonMap(..))
2122
import Data.List as L
@@ -105,12 +106,14 @@ parse1000
105106
tens x y = x * 10 + y
106107

107108
parseNat
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

115118
parseNegative
116119
m a
@@ -158,7 +161,7 @@ parsePositiveScientific
158161
P.ParserT String m HN.HugeNum
159162
parsePositiveScientific = 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-
175177
parseHugeNum
176178
m
177179
. Monad m
@@ -202,8 +204,11 @@ parseBooleanLiteral =
202204
parseDecimalLiteral m. Monad m P.ParserT String m HN.HugeNum
203205
parseDecimalLiteral = parseHugeNum <|> parseScientific
204206

207+
parseHugeIntLiteral m. Monad m P.ParserT String m HI.HugeInt
208+
parseHugeIntLiteral = parseSigned (parseNat (HI.fromInt 10) HI.fromInt)
209+
205210
parseIntLiteral m. Monad m P.ParserT String m Int
206-
parseIntLiteral = parseSigned parseNat
211+
parseIntLiteral = parseSigned (parseNat 10 id)
207212

208213
parseStringLiteral m. Monad m P.ParserT String m String
209214
parseStringLiteral = quoted stringInner
@@ -226,11 +231,11 @@ parseEJsonF
226231
P.ParserT String m a
227232
P.ParserT String m (EJsonF a)
228233
parseEJsonF 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

src/Data/Json/Extended/Signature/Render.purs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,24 @@ import Prelude
66

77
import Data.Either (fromRight)
88
import Data.Foldable as F
9+
import Data.HugeInt as HI
910
import Data.HugeNum as HN
1011
import Data.Json.Extended.Signature.Core (EJsonF(..), EJsonMap(..))
12+
import Data.Maybe (fromMaybe)
13+
import Data.String as Str
1114
import Data.String.Regex as RX
1215
import Data.String.Regex.Flags as RXF
1316
import Data.Tuple as T
14-
1517
import Matryoshka (Algebra)
16-
1718
import Partial.Unsafe (unsafePartial)
1819

1920
renderEJsonF Algebra EJsonF String
2021
renderEJsonF = case _ of
2122
Null"null"
2223
Boolean b → if b then "true" else "false"
23-
Integer i → show i
24+
Integer i →
25+
let s = HN.toString (HI.toHugeNum i)
26+
in fromMaybe s $ Str.stripSuffix (Str.Pattern ".0") s
2427
Decimal a → HN.toString a
2528
String str → stringEJson str
2629
Array ds → squares $ commaSep ds

0 commit comments

Comments
 (0)