-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Provides a way to persist data from compile-time to runtime.
--   
--   This package provides a way to persist data from compile-time to
--   runtime by producing Template Haskell expressions that evaluate to
--   particular values. For example, if you have a value <tt>Just 1</tt>,
--   then <tt>toExp (Just 1)</tt> will produce the <i>expression</i>
--   <tt>[e| Just 1 |]</tt>, which can be used in a splice. For a more
--   direct example, here’s what that looks like without the quasiquote
--   notation:
--   
--   <pre>
--   &gt;&gt;&gt; toExp (Just 1)
--   AppE (ConE GHC.Base.Just) (LitE (IntegerL 1))
--   </pre>
--   
--   This is done by using a typeclass, <a>ToExp</a>, that can be
--   automatically derived for types that have a <a>Generic</a> instance.
@package th-to-exp
@version 0.0.1.1


-- | This module provides the <a>ToExp</a> class, which can be used to
--   convert values into Template Haskell <a>Exp</a> values that represent
--   expressions that evaluate to the original values. This makes it
--   possible to persist/reify values between compile-time and runtime.
module Language.Haskell.TH.ToExp

-- | Converts arbitrary values to Template Haskell <a>Exp</a> values, which
--   can be used in splices to reconstruct the original value. This is
--   useful to persist a compile-time value to a runtime one.
--   
--   <pre>
--   &gt;&gt;&gt; toExp (Just 1)
--   AppE (ConE GHC.Base.Just) (LitE (IntegerL 1))
--   </pre>
--   
--   This class can be automatically derived for types with a
--   <a>Generic</a> instance.
class ToExp a
toExp :: ToExp a => a -> Exp
toExp :: (ToExp a, Generic a, GToExp (Rep a)) => a -> Exp

-- | An implementation of <a>toExp</a> that can be used for types with an
--   <a>Integral</a> instance.
--   
--   <pre>
--   &gt;&gt;&gt; toExpIntegral (ConT ''Int) 3
--   SigE (LitE (IntegerL 3)) (ConT GHC.Types.Int)
--   </pre>
toExpIntegral :: Integral a => Type -> a -> Exp
instance (GHC.Generics.Constructor c, Language.Haskell.TH.ToExp.GProductToExps f) => Language.Haskell.TH.ToExp.GToExp' (GHC.Generics.C1 c f)
instance Language.Haskell.TH.ToExp.GProductToExps GHC.Generics.U1
instance Language.Haskell.TH.ToExp.ToExp c => Language.Haskell.TH.ToExp.GProductToExps (GHC.Generics.K1 i c)
instance Language.Haskell.TH.ToExp.GProductToExps f => Language.Haskell.TH.ToExp.GProductToExps (GHC.Generics.M1 i t f)
instance (Language.Haskell.TH.ToExp.GProductToExps a, Language.Haskell.TH.ToExp.GProductToExps b) => Language.Haskell.TH.ToExp.GProductToExps (a GHC.Generics.:*: b)
instance (GHC.Generics.Datatype d, Language.Haskell.TH.ToExp.GToExp' (GHC.Generics.D1 d cs)) => Language.Haskell.TH.ToExp.GToExp (GHC.Generics.D1 d cs)
instance Language.Haskell.TH.ToExp.GToExp' f => Language.Haskell.TH.ToExp.GToExp' (GHC.Generics.D1 t f)
instance (Language.Haskell.TH.ToExp.GToExp' f, Language.Haskell.TH.ToExp.GToExp' g) => Language.Haskell.TH.ToExp.GToExp' (f GHC.Generics.:+: g)
instance Language.Haskell.TH.ToExp.ToExp GHC.Integer.Type.Integer
instance Language.Haskell.TH.ToExp.ToExp GHC.Types.Int
instance Language.Haskell.TH.ToExp.ToExp GHC.Word.Word8
instance Language.Haskell.TH.ToExp.ToExp a => Language.Haskell.TH.ToExp.ToExp (GHC.Real.Ratio a)
instance Language.Haskell.TH.ToExp.ToExp GHC.Types.Char
instance Language.Haskell.TH.ToExp.ToExp a => Language.Haskell.TH.ToExp.ToExp [a]
instance Language.Haskell.TH.ToExp.ToExp ()
instance Language.Haskell.TH.ToExp.ToExp GHC.Types.Bool
instance Language.Haskell.TH.ToExp.ToExp GHC.Types.Ordering
instance Language.Haskell.TH.ToExp.ToExp a => Language.Haskell.TH.ToExp.ToExp (GHC.Base.Maybe a)
instance (Language.Haskell.TH.ToExp.ToExp a, Language.Haskell.TH.ToExp.ToExp b) => Language.Haskell.TH.ToExp.ToExp (Data.Either.Either a b)
instance (Language.Haskell.TH.ToExp.ToExp a, Language.Haskell.TH.ToExp.ToExp b) => Language.Haskell.TH.ToExp.ToExp (a, b)
instance (Language.Haskell.TH.ToExp.ToExp a, Language.Haskell.TH.ToExp.ToExp b, Language.Haskell.TH.ToExp.ToExp c) => Language.Haskell.TH.ToExp.ToExp (a, b, c)
instance (Language.Haskell.TH.ToExp.ToExp a, Language.Haskell.TH.ToExp.ToExp b, Language.Haskell.TH.ToExp.ToExp c, Language.Haskell.TH.ToExp.ToExp d) => Language.Haskell.TH.ToExp.ToExp (a, b, c, d)
instance (Language.Haskell.TH.ToExp.ToExp a, Language.Haskell.TH.ToExp.ToExp b, Language.Haskell.TH.ToExp.ToExp c, Language.Haskell.TH.ToExp.ToExp d, Language.Haskell.TH.ToExp.ToExp e) => Language.Haskell.TH.ToExp.ToExp (a, b, c, d, e)
instance (Language.Haskell.TH.ToExp.ToExp a, Language.Haskell.TH.ToExp.ToExp b, Language.Haskell.TH.ToExp.ToExp c, Language.Haskell.TH.ToExp.ToExp d, Language.Haskell.TH.ToExp.ToExp e, Language.Haskell.TH.ToExp.ToExp f) => Language.Haskell.TH.ToExp.ToExp (a, b, c, d, e, f)
instance (Language.Haskell.TH.ToExp.ToExp a, Language.Haskell.TH.ToExp.ToExp b, Language.Haskell.TH.ToExp.ToExp c, Language.Haskell.TH.ToExp.ToExp d, Language.Haskell.TH.ToExp.ToExp e, Language.Haskell.TH.ToExp.ToExp f, Language.Haskell.TH.ToExp.ToExp g) => Language.Haskell.TH.ToExp.ToExp (a, b, c, d, e, f, g)
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.AnnLookup
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.AnnTarget
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Bang
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Body
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Callconv
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Clause
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Con
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Dec
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.DecidedStrictness
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Exp
instance Language.Haskell.TH.ToExp.ToExp GHC.LanguageExtensions.Type.Extension
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.FamilyResultSig
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Fixity
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.FixityDirection
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Foreign
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.FunDep
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Guard
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Info
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.InjectivityAnn
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Inline
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Lit
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Match
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.ModName
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Module
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.ModuleInfo
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Name
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.NameFlavour
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.NameSpace
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.OccName
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Overlap
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Pat
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Phases
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.PkgName
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Pragma
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Range
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Role
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.RuleBndr
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.RuleMatch
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Safety
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.SourceStrictness
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.SourceUnpackedness
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Stmt
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.TyLit
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.Type
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.TypeFamilyHead
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.TySynEqn
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.TyVarBndr
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.DerivClause
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.DerivStrategy
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.PatSynArgs
instance Language.Haskell.TH.ToExp.ToExp Language.Haskell.TH.Syntax.PatSynDir
