{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Aeson.Deriving.Utils
( mapObjects
, mapField
, All
, textVal
) where
import Data.Aeson
import qualified Data.HashMap.Strict as HashMap
import Data.Kind (Constraint)
import Data.Proxy
import Data.Text
import GHC.TypeLits
mapObjects :: (Object -> Object) -> Value -> Value
mapObjects f (Object o) = Object (f o)
mapObjects _ val = val
mapField :: Text -> (Value -> Value) -> Object -> Object
mapField str f = HashMap.mapWithKey $ \s x ->
if s == str then f x else x
type family All (predicate :: k -> Constraint) (types :: [k]) :: Constraint where
All predicate '[] = ()
All predicate (t ': ts) = (predicate t, All predicate ts)
textVal :: KnownSymbol s => Proxy s -> Text
textVal = pack . symbolVal