{-# LANGUAGE FlexibleContexts #-}

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

Functions that trace the values of 'Generic' instances (even if they are not
instances of @TextShow@).

/Since: 2/
-}
module TextShow.Debug.Trace.Generic (
      genericTraceTextShow
    , genericTraceTextShowId
    , genericTraceTextShowM
    ) where

import Generics.Deriving.Base (Generic, Rep)

import Prelude ()
import Prelude.Compat

import TextShow.Debug.Trace
import TextShow.Generic (GTextShowT, Zero, genericShowt)

-- | A 'Generic' implementation of 'traceTextShow'.
--
-- /Since: 2/
genericTraceTextShow :: (Generic a, GTextShowT Zero (Rep a)) => a -> b -> b
genericTraceTextShow = tracet . genericShowt

-- | A 'Generic' implementation of 'traceTextShowId'.
--
-- /Since: 2/
genericTraceTextShowId :: (Generic a, GTextShowT Zero (Rep a)) => a -> a
genericTraceTextShowId a = tracet (genericShowt a) a

-- | A 'Generic' implementation of 'traceShowM'.
--
-- /Since: 2/
genericTraceTextShowM :: (Generic a, GTextShowT Zero (Rep a), Applicative f) => a -> f ()
genericTraceTextShowM = tracetM . genericShowt