    {-# LANGUAGE TemplateHaskell #-}
    {-|
    Module:      TextShow.Debug.Trace.TH
    Copyright:   (C) 2014-2017 Ryan Scott
    License:     BSD-style (see the file LICENSE)
    Maintainer:  Ryan Scott
    Stability:   Provisional
    Portability: GHC

    Functions that splice traces into source code which take an arbitrary data type or
    data family instance as an argument (even if it is not an instance of @TextShow@). You
    need to enable the @TemplateHaskell@ language extension in order to use this module.

    /Since: 2/
    -}
    module TextShow.Debug.Trace.TH (
          makeTraceTextShow
        , makeTraceTextShowId
        , makeTraceTextShowM
        ) where

    import Language.Haskell.TH.Syntax (Name, Q, Exp)

    import TextShow.Debug.Trace
    import TextShow.TH.Internal (makeShowt)

    -- | Generates a lambda expression which behaves like 'traceTextShow' (without
    -- requiring a @TextShow@ instance).
    --
    -- /Since: 2/
    makeTraceTextShow :: Name -> Q Exp
    makeTraceTextShow :: Name -> Q Exp
    makeTraceTextShow Name
    name = [| tracet . $(Name -> Q Exp
    makeShowt Name
    name) |]

    -- | Generates a lambda expression which behaves like 'traceTextShowId' (without
    -- requiring a @TextShow@ instance).
    --
    -- /Since: 2/
    makeTraceTextShowId :: Name -> Q Exp
    makeTraceTextShowId :: Name -> Q Exp
    makeTraceTextShowId Name
    name = [| \a -> tracet ($(Name -> Q Exp
    makeShowt Name
    name) a) a |]

    -- | Generates a lambda expression which behaves like 'traceTextShowM' (without
    -- requiring a @TextShow@ instance).
    --
    -- /Since: 2/
    makeTraceTextShowM :: Name -> Q Exp
    makeTraceTextShowM :: Name -> Q Exp
    makeTraceTextShowM Name
    name = [| tracetM . $(Name -> Q Exp
    makeShowt Name
    name) |]