{-# LANGUAGE PolyKinds            #-}
{-# LANGUAGE TypeFamilies         #-}
{-# LANGUAGE UndecidableInstances #-}

module Data.Aeson.Deriving.Generic
  ( -- * Typeclass for aeson 'Options'
    ToAesonOptions(..)
  -- * newtypes for Generic encodings
  -- ** Main data type for Generic encodings
  , GenericEncoded(..)
  -- ** Data type for encodings of composite "sum-of-records" types
  , RecordSumEncoded(..)
  -- * Phantom types for specifying Options
  -- ** Many-parameter type for explicitly providing all 'Options' fields.
  , GenericOptions
  -- ** Types for supplying specific Options fields
  -- *** Type representing field assignment
  , (:=)
  -- *** Typeclass for Options fields
  , ToAesonOptionsField
  -- *** Types representing Options fields
  , FieldLabelModifier
  , ConstructorTagModifier
  , AllNullaryToStringTag
  , OmitNothingFields
  , SumEncoding  -- technically an aeson reexport. Shouldn't matter.
  , UnwrapUnaryRecords
  , TagSingleConstructors
  --  *** String Functions
  , StringFunction(..)
  , SnakeCase
  , Uppercase
  , Lowercase
  , FirstChar
  , DropLowercasePrefix
  , DropPrefix
  , DropSuffix
  , Id
  , snakeCase
  , dropLowercasePrefix
  --  *** Sum encoding options
  , ToSumEncoding
  , UntaggedValue
  , ObjectWithSingleField
  , TwoElemArray
  , TaggedObject
  -- * Safety class
  , LoopWarning
  , DisableLoopWarning(..)
  -- * Convenience newtype
  , type (&) (Ampersand)
  , unAmpersand
  ) where

import           Data.Aeson
import           Data.Aeson.Deriving.Internal.Generic
import           Data.Aeson.Deriving.Known