@@ -13,11 +13,12 @@ import Data.HugeNum as HN
1313import Data.Int as Int
1414import Data.Json.Extended.Type as JT
1515import Data.List as L
16+ import Data.Map as M
1617import Data.Monoid (mempty )
17- import Data.Ord (class Ord1 )
18+ import Data.Ord (class Ord1 , compare1 )
19+ import Data.TacitString (TacitString )
1820import Data.Traversable as T
1921import Data.Tuple (Tuple (..))
20- import Data.TacitString (TacitString )
2122
2223-- | The signature endofunctor for the EJson theory.
2324data EJsonF a
@@ -80,6 +81,7 @@ instance traversableEJsonF ∷ T.Traversable EJsonF where
8081 ObjectId oid → pure $ ObjectId oid
8182 sequence = T .sequenceDefault
8283
84+ -- Note: this cannot be derived due to integer/decimal equality and map equality
8385instance eq1EJsonF ∷ Eq1 EJsonF where
8486 eq1 Null Null = true
8587 eq1 (Boolean b1) (Boolean b2) = b1 == b2
@@ -127,9 +129,59 @@ intToHugeNum =
127129 HN .fromNumber
128130 <<< Int .toNumber
129131
130- derive instance ordEJsonF ∷ Ord a ⇒ Ord (EJsonF a )
132+ instance ordEJsonF ∷ Ord a ⇒ Ord (EJsonF a ) where
133+ compare = compare1
134+
135+ -- Note: this cannot be derived, due to integer/decimal comparisons and map
136+ -- comparisons
131137instance ord1EJsonF ∷ Ord1 EJsonF where
132- compare1 = compare
138+ compare1 Null Null = EQ
139+ compare1 _ Null = GT
140+ compare1 Null _ = LT
141+
142+ compare1 (Boolean b1) (Boolean b2) = compare b1 b2
143+ compare1 _ (Boolean _) = GT
144+ compare1 (Boolean _) _ = LT
145+
146+ compare1 (Integer i) (Integer j) = compare i j
147+ compare1 (Integer i) (Decimal b) = compare (intToHugeNum i) b
148+ compare1 (Decimal a) (Integer j) = compare a (intToHugeNum j)
149+ compare1 _ (Integer _) = GT
150+ compare1 (Integer _) _ = LT
151+
152+ compare1 (Decimal a) (Decimal b) = compare a b
153+ compare1 _ (Decimal _) = GT
154+ compare1 (Decimal _) _ = LT
155+
156+ compare1 (String a) (String b) = compare a b
157+ compare1 _ (String _) = GT
158+ compare1 (String _) _ = LT
159+
160+ compare1 (Timestamp a) (Timestamp b) = compare a b
161+ compare1 _ (Timestamp _) = GT
162+ compare1 (Timestamp _) _ = LT
163+
164+ compare1 (Date a) (Date b) = compare a b
165+ compare1 _ (Date _) = GT
166+ compare1 (Date _) _ = LT
167+
168+ compare1 (Time a) (Time b) = compare a b
169+ compare1 _ (Time _) = GT
170+ compare1 (Time _) _ = LT
171+
172+ compare1 (Interval a) (Interval b) = compare a b
173+ compare1 _ (Interval _) = GT
174+ compare1 (Interval _) _ = LT
175+
176+ compare1 (ObjectId a) (ObjectId b) = compare a b
177+ compare1 _ (ObjectId _) = GT
178+ compare1 (ObjectId _) _ = LT
179+
180+ compare1 (Array a) (Array b) = compare a b
181+ compare1 _ (Array _) = GT
182+ compare1 (Array _) _ = LT
183+
184+ compare1 (Map a) (Map b) = compare (M .fromFoldable a) (M .fromFoldable b)
133185
134186instance showEJsonF ∷ Show (EJsonF TacitString ) where
135187 show = case _ of
0 commit comments