content: {-# LANGUAGE PolyKinds            #-}
  {-# LANGUAGE TypeFamilies         #-}
  {-# LANGUAGE UndecidableInstances #-}
  
  module Data.Aeson.Deriving.Internal.Generic where
  
  
  ------------------------------------------------------------------------------------------
  -- A Single type for all Options fields
  ------------------------------------------------------------------------------------------
  
  -- | Type-level representation of the Aeson Generic deriving 'Options'.
  --   This representation is useful for explicitly setting all options.
  data GenericOptions
    :: fieldLabelModifier
    -> tagSingleConstructors
    -> Type
  
  instance
    ( All StringFunction [fieldLabelModifier, constructorTagModifier]
    , ToSumEncoding sumEncoding
    , All KnownBool
       [ allNullaryToStringTag
       , tagSingleConstructors
       ]
    ) => ToAesonOptions
      (GenericOptions
        (FieldLabelModifier := fieldLabelModifier)
        (ConstructorTagModifier := constructorTagModifier)
        (TagSingleConstructors := tagSingleConstructors)) where
    toAesonOptions _           = defaultOptions
      { fieldLabelModifier     = stringFunction $ Proxy @fieldLabelModifier
      , tagSingleConstructors  = boolVal $ Proxy @tagSingleConstructors
      }
  
  
  
  