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

Commit 10be5a8

Browse files
authored
Wo types (#17)
* coalgebras for arbitrary and parser * removed tagged literals
1 parent a7e98a7 commit 10be5a8

File tree

8 files changed

+74
-436
lines changed

8 files changed

+74
-436
lines changed

src/Data/Json/Extended.purs

+9-88
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@ module Data.Json.Extended
66
, integer
77
, decimal
88
, string
9-
, timestamp
10-
, date
11-
, time
12-
, interval
13-
, objectId
149
, map
1510
, map'
1611
, array
@@ -21,7 +16,6 @@ module Data.Json.Extended
2116
, encodeEJson
2217

2318
, arbitraryEJsonOfSize
24-
, arbitraryJsonEncodableEJsonOfSize
2519

2620
, getType
2721

@@ -30,27 +24,20 @@ module Data.Json.Extended
3024
, _Boolean
3125
, _Integer
3226
, _Decimal
33-
, _Timestamp
34-
, _Date
35-
, _Time
36-
, _Interval
37-
, _ObjectId
3827
, _Array
3928
, _Map
4029
, _Map'
4130
) where
4231

4332
import Prelude hiding (map)
4433

45-
import Data.Functor as F
46-
4734
import Control.Lazy as Lazy
4835

4936
import Data.Argonaut as JS
5037
import Data.Array as A
5138
import Data.Bitraversable (bitraverse)
52-
import Data.DateTime as DT
5339
import Data.Either as E
40+
import Data.Functor as F
5441
import Data.Functor.Mu as Mu
5542
import Data.HugeNum as HN
5643
import Data.Json.Extended.Signature as Sig
@@ -61,56 +48,30 @@ import Data.Maybe as M
6148
import Data.StrMap as SM
6249
import Data.Traversable (for)
6350
import Data.Tuple as T
51+
import Data.Json.Extended.Signature hiding (getType) as Exports
6452

6553
import Matryoshka (class Corecursive, class Recursive, anaM, cata, embed, project)
6654

67-
import Test.StrongCheck.Arbitrary as SC
6855
import Test.StrongCheck.Gen as Gen
6956
import Text.Parsing.Parser as P
7057

71-
import Data.Json.Extended.Signature hiding (getType) as Exports
72-
7358
type EJson = Mu.Mu Sig.EJsonF
7459

75-
decodeEJson :: forall t. Corecursive t Sig.EJsonF JS.Json E.Either String t
60+
decodeEJson t. Corecursive t Sig.EJsonF JS.Json E.Either String t
7661
decodeEJson = anaM Sig.decodeJsonEJsonF
7762

78-
encodeEJson :: forall t. Recursive t Sig.EJsonF t -> JS.Json
63+
encodeEJson t. Recursive t Sig.EJsonF t JS.Json
7964
encodeEJson = cata Sig.encodeJsonEJsonF
8065

81-
arbitraryEJsonOfSize
82-
Gen.Size
83-
Gen.Gen EJson
84-
arbitraryEJsonOfSize size =
85-
embed <$>
86-
case size of
87-
0Sig.arbitraryBaseEJsonF
88-
n → Sig.arbitraryEJsonF $ arbitraryEJsonOfSize (n - 1)
89-
90-
-- | Generate only JSON-encodable objects
91-
arbitraryJsonEncodableEJsonOfSize
92-
Gen.Size
93-
Gen.Gen EJson
94-
arbitraryJsonEncodableEJsonOfSize size =
95-
embed <$>
96-
case size of
97-
0Sig.arbitraryBaseEJsonF
98-
n → Sig.arbitraryEJsonFWithKeyGen keyGen $ arbitraryJsonEncodableEJsonOfSize (n - 1)
99-
where
100-
keyGen =
101-
embed <<< Sig.String <$>
102-
SC.arbitrary
66+
arbitraryEJsonOfSize t. Corecursive t Sig.EJsonF Gen.Size Gen.Gen t
67+
arbitraryEJsonOfSize = anaM Sig.arbitraryEJsonF
10368

104-
renderEJson EJson String
105-
renderEJson =
106-
cata Sig.renderEJsonF
69+
renderEJson t. Recursive t Sig.EJsonF t String
70+
renderEJson = cata Sig.renderEJsonF
10771

108-
-- | A closed parser of SQL^2 constant expressions
10972
parseEJson m. Monad m P.ParserT String m EJson
11073
parseEJson =
111-
Lazy.fix \f →
112-
embed <$>
113-
Sig.parseEJsonF f
74+
Lazy.fix \f → embed <$> Sig.parseEJsonF f
11475

11576
null t. Corecursive t Sig.EJsonF t
11677
null = embed Sig.Null
@@ -127,21 +88,6 @@ decimal = embed <<< Sig.Decimal
12788
string t. Corecursive t Sig.EJsonF String t
12889
string = embed <<< Sig.String
12990

130-
timestamp t. Corecursive t Sig.EJsonF DT.DateTime t
131-
timestamp = embed <<< Sig.Timestamp
132-
133-
date t. Corecursive t Sig.EJsonF DT.Date t
134-
date = embed <<< Sig.Date
135-
136-
time t. Corecursive t Sig.EJsonF DT.Time t
137-
time = embed <<< Sig.Time
138-
139-
interval t. Corecursive t Sig.EJsonF String t
140-
interval = embed <<< Sig.Interval
141-
142-
objectId t. Corecursive t Sig.EJsonF String t
143-
objectId = embed <<< Sig.ObjectId
144-
14591
array t. Corecursive t Sig.EJsonF Array t t
14692
array = embed <<< Sig.Array
14793

@@ -181,31 +127,6 @@ _Decimal = prism' decimal $ project >>> case _ of
181127
Sig.Decimal d → M.Just d
182128
_ → M.Nothing
183129

184-
_Timestamp t. (Corecursive t Sig.EJsonF, Recursive t Sig.EJsonF) Prism' t DT.DateTime
185-
_Timestamp = prism' timestamp $ project >>> case _ of
186-
Sig.Timestamp t → M.Just t
187-
_ → M.Nothing
188-
189-
_Date t. (Corecursive t Sig.EJsonF, Recursive t Sig.EJsonF) Prism' t DT.Date
190-
_Date = prism' date $ project >>> case _ of
191-
Sig.Date d → M.Just d
192-
_ → M.Nothing
193-
194-
_Time t. (Corecursive t Sig.EJsonF, Recursive t Sig.EJsonF) Prism' t DT.Time
195-
_Time = prism' time $ project >>> case _ of
196-
Sig.Time t → M.Just t
197-
_ → M.Nothing
198-
199-
_Interval t. (Corecursive t Sig.EJsonF, Recursive t Sig.EJsonF) Prism' t String
200-
_Interval = prism' interval $ project >>> case _ of
201-
Sig.Interval i → M.Just i
202-
_ → M.Nothing
203-
204-
_ObjectId t. (Corecursive t Sig.EJsonF, Recursive t Sig.EJsonF) Prism' t String
205-
_ObjectId = prism' objectId $ project >>> case _ of
206-
Sig.ObjectId id → M.Just id
207-
_ → M.Nothing
208-
209130
_Array t. (Corecursive t Sig.EJsonF, Recursive t Sig.EJsonF) Prism' t (Array t)
210131
_Array = prism' array $ project >>> case _ of
211132
Sig.Array xs → M.Just xs

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

+2-23
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ module Data.Json.Extended.Signature.Core
77
import Prelude
88

99
import Data.Bifunctor as BF
10-
import Data.DateTime as DT
1110
import Data.Eq (class Eq1)
1211
import Data.Foldable as F
1312
import Data.HugeNum as HN
@@ -28,11 +27,6 @@ data EJsonF a
2827
| Boolean Boolean
2928
| Integer Int
3029
| Decimal HN.HugeNum
31-
| Timestamp DT.DateTime
32-
| Date DT.Date
33-
| Time DT.Time
34-
| Interval String
35-
| ObjectId String
3630
| Array (Array a)
3731
| Map (EJsonMap a)
3832

@@ -66,12 +60,7 @@ instance traversableEJsonF ∷ T.Traversable EJsonF where
6660
String str → pure $ String str
6761
Boolean b → pure $ Boolean b
6862
Integer i → pure $ Integer i
69-
Decimal a → pure $ Decimal a
70-
Timestamp ts → pure $ Timestamp ts
71-
Date d → pure $ Date d
72-
Time t → pure $ Time t
73-
Interval i → pure $ Interval i
74-
ObjectId oid → pure $ ObjectId oid
63+
Decimal d → pure $ Decimal d
7564
sequence = T.sequenceDefault
7665

7766
instance showEJsonFShow (EJsonF TacitString) where
@@ -80,12 +69,7 @@ instance showEJsonF ∷ Show (EJsonF TacitString) where
8069
String s → "(String " <> show s <> ")"
8170
Boolean b → "(Boolean " <> show b <> ")"
8271
Integer i → "(Integer " <> show i <> ")"
83-
Decimal n → "(Decimal " <> show n <> ")"
84-
Timestamp r → "(Timestamp " <> show r <> ")"
85-
Date d → "(Date " <> show d <> ")"
86-
Time t → "(Time " <> show t <> ")"
87-
Interval i → "(Interval " <> show i <> ")"
88-
ObjectId i → "(ObjectId " <> show i <> ")"
72+
Decimal d → "(Decimal " <> show d <> ")"
8973
Array xs → "(Array " <> show xs <> ")"
9074
Map kvs → "(Map " <> show kvs <> ")"
9175

@@ -96,11 +80,6 @@ getType = case _ of
9680
Boolean _ → JT.Boolean
9781
Integer _ → JT.Integer
9882
Decimal _ → JT.Decimal
99-
Timestamp _ → JT.Timestamp
100-
Date _ → JT.Date
101-
Time _ → JT.Time
102-
Interval _ → JT.Interval
103-
ObjectId _ → JT.ObjectId
10483
Array _ → JT.Array
10584
Map _ → JT.Map
10685

+14-86
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,30 @@
11
module Data.Json.Extended.Signature.Gen
2-
( arbitraryBaseEJsonF
3-
, arbitraryEJsonF
4-
, arbitraryEJsonFWithKeyGen
2+
( arbitraryEJsonF
53
) where
64

75
import Prelude
86

97
import Data.Array as A
10-
import Data.DateTime as DT
11-
import Data.Enum (toEnum)
128
import Data.HugeNum as HN
139
import Data.Json.Extended.Signature.Core (EJsonF(..), EJsonMap(..))
14-
import Data.Maybe (fromMaybe)
1510
import Data.Tuple as T
1611

12+
import Matryoshka (CoalgebraM)
13+
1714
import Test.StrongCheck.Arbitrary as SC
1815
import Test.StrongCheck.Gen as Gen
1916

20-
arbitraryBaseEJsonF a. Gen.Gen (EJsonF a)
21-
arbitraryBaseEJsonF =
17+
arbitraryEJsonF CoalgebraM Gen.Gen EJsonF Int
18+
arbitraryEJsonF 0 =
2219
Gen.oneOf (pure Null)
23-
[ Boolean <$> SC.arbitrary
24-
, Integer <$> SC.arbitrary
25-
, Decimal <$> arbitraryDecimal
26-
, String <$> SC.arbitrary
27-
, Timestamp <$> arbitraryDateTime
28-
, Date <$> arbitraryDate
29-
, Time <$> arbitraryTime
30-
, Interval <$> SC.arbitrary
31-
, ObjectId <$> SC.arbitrary
32-
, 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
3324
]
34-
35-
arbitraryEJsonFWithKeyGen
36-
a
37-
. (Eq a)
38-
Gen.Gen a
39-
Gen.Gen a
40-
Gen.Gen (EJsonF a)
41-
arbitraryEJsonFWithKeyGen keyGen rec =
42-
Gen.oneOf (pure Null)
43-
[ arbitraryBaseEJsonF
44-
, Array <$> Gen.arrayOf rec
45-
, Map <<< EJsonMap <$> do
46-
keys ← distinctArrayOf keyGen
47-
vals ← Gen.vectorOf (A.length keys) rec
48-
pure $ A.zip keys vals
25+
arbitraryEJsonF n = do
26+
len ← Gen.chooseInt 0 $ n - 1
27+
Gen.oneOf (arbitraryEJsonF 0)
28+
[ pure $ Array $ A.replicate len $ n - 1
29+
, pure $ Map $ EJsonMap $ A.replicate len $ T.Tuple (n - 1) (n - 1)
4930
]
50-
51-
where
52-
arbitraryTuple Gen.Gen (T.Tuple a a)
53-
arbitraryTuple =
54-
T.Tuple
55-
<$> keyGen
56-
<*> rec
57-
58-
arbitraryEJsonF
59-
a
60-
. (Eq a)
61-
Gen.Gen a
62-
Gen.Gen (EJsonF a)
63-
arbitraryEJsonF rec =
64-
arbitraryEJsonFWithKeyGen rec rec
65-
66-
distinctArrayOf
67-
a
68-
. (Eq a)
69-
Gen.Gen a
70-
Gen.Gen (Array a)
71-
distinctArrayOf =
72-
map A.nub
73-
<<< Gen.arrayOf
74-
75-
arbitraryDecimal Gen.Gen HN.HugeNum
76-
arbitraryDecimal =
77-
HN.fromNumber
78-
<$> SC.arbitrary
79-
80-
arbitraryDateTime Gen.Gen DT.DateTime
81-
arbitraryDateTime = DT.DateTime <$> arbitraryDate <*> arbitraryTime
82-
83-
arbitraryDate Gen.Gen DT.Date
84-
arbitraryDate = do
85-
year ← Gen.chooseInt 1950 2050
86-
month ← Gen.chooseInt 1 12
87-
day ← Gen.chooseInt 1 31
88-
pure $ DT.canonicalDate
89-
(fromMaybe bottom (toEnum year))
90-
(fromMaybe bottom (toEnum month))
91-
(fromMaybe bottom (toEnum day))
92-
93-
arbitraryTime Gen.Gen DT.Time
94-
arbitraryTime = do
95-
hour ← Gen.chooseInt 0 23
96-
minute ← Gen.chooseInt 0 59
97-
second ← Gen.chooseInt 0 59
98-
pure $ DT.Time
99-
(fromMaybe bottom (toEnum hour))
100-
(fromMaybe bottom (toEnum minute))
101-
(fromMaybe bottom (toEnum second))
102-
bottom

0 commit comments

Comments
 (0)