scrapbook-0.3.2: src/ScrapBook/Internal/Instances.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module ScrapBook.Internal.Instances where
import RIO
import qualified RIO.HashMap as M.Hash
import qualified RIO.Text as T
import Data.Aeson (ToJSON (..))
import qualified Data.Aeson as JSON
import Data.Extensible
import Data.Proxy (Proxy (..))
import GHC.TypeLits (KnownSymbol, symbolVal)
instance Forall (KeyValue KnownSymbol ToJSON) xs => ToJSON (Variant xs) where
toJSON = matchField $
htabulateFor (Proxy :: Proxy (KeyValue KnownSymbol ToJSON)) $ \m ->
let key = T.pack . symbolVal $ proxyAssocKey m
in Field (Match $ JSON.Object . kvToJSON key . runIdentity)
kvToJSON :: ToJSON v => Text -> v -> JSON.Object
kvToJSON key val =
M.Hash.fromList [("type", JSON.String key), ("value", toJSON val)]