module EZCouch.Doc where
import Prelude ()
import ClassyPrelude
import GHC.Generics
import Data.Aeson
class (ToJSON a, FromJSON a) => Doc a where
docType :: a -> Text
default docType :: (Generic a, GDoc (Rep a)) => a -> Text
docType = gDocType . from
class GDoc f where
gDocType :: f a -> Text
instance (GDoc a) => GDoc (M1 i c a) where
gDocType = gDocType . unM1
instance (Constructor c) => GDoc (C1 c a) where
gDocType = const . pack $ conName (undefined :: t c a p)
instance (GDoc a, GDoc b) => GDoc (a :+: b) where
gDocType (L1 x) = gDocType x
gDocType (R1 x) = gDocType x