1
1
module GraphQL.Client.Alias.Dynamic where
2
2
3
3
import Prelude
4
-
5
4
import Data.Argonaut.Core (Json )
5
+ import Data.Argonaut.Core as Argonaut
6
6
import Data.Argonaut.Decode (class DecodeJson , JsonDecodeError , decodeJson )
7
7
import Data.Argonaut.Decode.Decoders (decodeJObject )
8
+ import Data.Argonaut.Encode (class EncodeJson , encodeJson )
9
+ import Data.Array (mapWithIndex )
8
10
import Data.Array as Array
9
11
import Data.Either (Either )
10
12
import Data.Generic.Rep (class Generic )
11
- import Data.Newtype (class Newtype )
13
+ import Data.Newtype (class Newtype , unwrap )
12
14
import Data.Show.Generic (genericShow )
13
15
import Data.Traversable (traverse )
16
+ import Data.Tuple (Tuple (..))
17
+ import Foreign.Object as Object
14
18
import GraphQL.Hasura.Decode (class DecodeHasura , decodeHasura )
19
+ import GraphQL.Hasura.Encode (class EncodeHasura , encodeHasura )
15
20
16
21
-- | Used for creating spread aliases dynamically
17
22
-- | eq:
@@ -26,6 +31,7 @@ data Spread alias args fields
26
31
= Spread alias (Array args ) fields
27
32
28
33
-- | The return type of a query made with a dynamic alias spread
34
+ -- | This type has
29
35
newtype SpreadRes a
30
36
= SpreadRes (Array a )
31
37
@@ -37,7 +43,7 @@ derive instance eqSpreadRes :: Eq a => Eq (SpreadRes a)
37
43
38
44
derive instance ordSpreadRes :: Ord a => Ord (SpreadRes a )
39
45
40
- instance showSpreadRes :: Show a => Show (SpreadRes a ) where
46
+ instance showSpreadRes :: Show a => Show (SpreadRes a ) where
41
47
show = genericShow
42
48
43
49
decodeSpreadRes :: forall a . (Json -> Either JsonDecodeError a ) -> Json -> Either JsonDecodeError (SpreadRes a )
@@ -48,3 +54,16 @@ instance decodeHasuraSpreadRes :: DecodeHasura a => DecodeHasura (SpreadRes a) w
48
54
49
55
instance decodeJsonSpreadRes :: DecodeJson a => DecodeJson (SpreadRes a ) where
50
56
decodeJson = decodeSpreadRes decodeJson
57
+
58
+ encodeSpreadRes :: forall a . (a -> Json ) -> (SpreadRes a ) -> Json
59
+ encodeSpreadRes encoder =
60
+ unwrap
61
+ >>> mapWithIndex (\idx a -> Tuple (" _" <> show idx) (encoder a))
62
+ >>> Object .fromFoldable
63
+ >>> Argonaut .fromObject
64
+
65
+ instance encodeHasuraSpreadRes :: EncodeHasura a => EncodeHasura (SpreadRes a ) where
66
+ encodeHasura = encodeSpreadRes encodeHasura
67
+
68
+ instance encodeJsonSpreadRes :: EncodeJson a => EncodeJson (SpreadRes a ) where
69
+ encodeJson = encodeSpreadRes encodeJson
0 commit comments