Skip to content

Commit e7270d2

Browse files
authored
Merge pull request #6 from garyb/generic-sum
Add generic-based codec for nullary sum types
2 parents af29fb9 + 8cc8c67 commit e7270d2

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

src/Data/Codec/Argonaut/Generic.purs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
module Data.Codec.Argonaut.Generic where
2+
3+
import Prelude
4+
5+
import Control.Alt ((<|>))
6+
import Data.Argonaut.Core as J
7+
import Data.Codec as C
8+
import Data.Codec.Argonaut as CA
9+
import Data.Either (Either(..), note)
10+
import Data.Generic.Rep (class Generic, Constructor(..), NoArguments(..), Sum(..), from, to)
11+
import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)
12+
13+
nullarySum a r. Generic a r NullarySumCodec r String CA.JsonCodec a
14+
nullarySum name =
15+
C.basicCodec
16+
(map to <<< nullarySumDecode name)
17+
(nullarySumEncode <<< from)
18+
19+
class NullarySumCodec r where
20+
nullarySumEncode r J.Json
21+
nullarySumDecode String J.Json Either CA.JsonDecodeError r
22+
23+
instance nullarySumCodecSum ∷ (NullarySumCodec a, NullarySumCodec b) NullarySumCodec (Sum a b) where
24+
nullarySumEncode = case _ of
25+
Inl a → nullarySumEncode a
26+
Inr b → nullarySumEncode b
27+
nullarySumDecode name j
28+
= Inl <$> nullarySumDecode name j
29+
<|> Inr <$> nullarySumDecode name j
30+
31+
instance nullarySumCodecCtorIsSymbol name NullarySumCodec (Constructor name NoArguments) where
32+
nullarySumEncode _ =
33+
J.fromString $ reflectSymbol (SProxy SProxy name)
34+
nullarySumDecode name j = do
35+
tag ← note (CA.Named name (CA.TypeMismatch "String")) (J.toString j)
36+
if tag /= reflectSymbol (SProxy SProxy name)
37+
then Left (CA.Named name (CA.UnexpectedValue j))
38+
else Right (Constructor NoArguments)

0 commit comments

Comments
 (0)