@@ -154,6 +154,7 @@ import qualified Data.Foldable as F (all)
154
154
import qualified Data.HashMap.Strict as H (lookup , toList )
155
155
import qualified Data.List.NonEmpty as NE (length , reverse )
156
156
import qualified Data.Map as M (fromList , keys , lookup , singleton , size )
157
+ import qualified Data.Semigroup as Semigroup (Option (.. ))
157
158
import qualified Data.Set as Set (empty , insert , member )
158
159
import qualified Data.Text as T (Text , pack , unpack )
159
160
import qualified Data.Vector as V (unsafeIndex , null , length , create , fromList )
@@ -487,26 +488,28 @@ argsToValue jc tvMap opts multiCons
487
488
restFields
488
489
| otherwise = listE $ map toPair argCons
489
490
490
- argCons = zip3 args argTys' fields
491
+ argCons = zip3 ( map varE args) argTys' fields
491
492
492
493
maybeFields = [| catMaybes| ] `appE` listE (map maybeToPair maybes)
493
494
494
495
restFields = listE $ map toPair rest
495
496
496
- (maybes, rest) = partition isMaybe argCons
497
+ (maybes0, rest0) = partition isMaybe argCons
498
+ (options, rest) = partition isOption rest0
499
+ maybes = maybes0 ++ map optionToMaybe options
497
500
498
501
maybeToPair (arg, argTy, field) =
499
502
infixApp ([| keyValuePairWith| ]
500
503
`appE` dispatchToJSON jc conName tvMap argTy
501
504
`appE` toFieldName field)
502
505
[| (<$>) | ]
503
- (varE arg)
506
+ arg
504
507
505
508
toPair (arg, argTy, field) =
506
509
[| keyValuePairWith| ]
507
510
`appE` dispatchToJSON jc conName tvMap argTy
508
511
`appE` toFieldName field
509
- `appE` varE arg
512
+ `appE` arg
510
513
511
514
toFieldName field = [| T. pack| ] `appE` fieldLabelExp opts field
512
515
@@ -553,6 +556,13 @@ isMaybe :: (a, Type, b) -> Bool
553
556
isMaybe (_, AppT (ConT t) _, _) = t == ''Maybe
554
557
isMaybe _ = False
555
558
559
+ isOption :: (a , Type , b ) -> Bool
560
+ isOption (_, AppT (ConT t) _, _) = t == ''Semigroup. Option
561
+ isOption _ = False
562
+
563
+ optionToMaybe :: (ExpQ , b , c ) -> (ExpQ , b , c )
564
+ optionToMaybe (a, b, c) = ([| Semigroup. getOption| ] `appE` a, b, c)
565
+
556
566
(<^>) :: ExpQ -> ExpQ -> ExpQ
557
567
(<^>) a b = infixApp a [| (E. ><) | ] b
558
568
infixr 6 <^>
@@ -637,13 +647,15 @@ argsToEncoding jc tvMap opts multiCons
637
647
restFields
638
648
| otherwise = listE (map toPair argCons)
639
649
640
- argCons = zip3 args argTys' fields
650
+ argCons = zip3 ( map varE args) argTys' fields
641
651
642
652
maybeFields = [| catMaybes| ] `appE` listE (map maybeToPair maybes)
643
653
644
654
restFields = listE (map toPair rest)
645
655
646
- (maybes, rest) = partition isMaybe argCons
656
+ (maybes0, rest0) = partition isMaybe argCons
657
+ (options, rest) = partition isOption rest0
658
+ maybes = maybes0 ++ map optionToMaybe options
647
659
648
660
maybeToPair (arg, argTy, field) =
649
661
infixApp
@@ -655,12 +667,12 @@ argsToEncoding jc tvMap opts multiCons
655
667
[| (.) | ]
656
668
(dispatchToEncoding jc conName tvMap argTy))
657
669
[| (<$>) | ]
658
- (varE arg)
670
+ arg
659
671
660
672
toPair (arg, argTy, field) =
661
673
toFieldName field
662
674
<:> dispatchToEncoding jc conName tvMap argTy
663
- `appE` varE arg
675
+ `appE` arg
664
676
665
677
toFieldName field = [| E. text| ] `appE`
666
678
([| T. pack| ] `appE` fieldLabelExp opts field)
@@ -1234,6 +1246,11 @@ instance OVERLAPPABLE_ LookupField a where
1234
1246
instance INCOHERENT_ LookupField (Maybe a ) where
1235
1247
lookupField pj _ _ = parseOptionalFieldWith pj
1236
1248
1249
+ instance INCOHERENT_ LookupField (Semigroup. Option a ) where
1250
+ lookupField pj tName rec obj key =
1251
+ fmap Semigroup. Option
1252
+ (lookupField (fmap Semigroup. getOption . pj) tName rec obj key)
1253
+
1237
1254
lookupFieldWith :: (Value -> Parser a ) -> String -> String
1238
1255
-> Object -> T. Text -> Parser a
1239
1256
lookupFieldWith pj tName rec obj key =
0 commit comments