{-# LANGUAGE CPP, NoImplicitPrelude #-}
module Debug.Trace.Compat (
  module Base
, traceId
, traceShowId
, traceM
, traceShowM
, traceWith
, traceShowWith
, traceEventWith
) where

import Debug.Trace as Base

#if !(MIN_VERSION_base(4,18,0))
import Prelude.Compat
#endif

#if !(MIN_VERSION_base(4,18,0))
{-|
Like 'trace', but outputs the result of calling a function on the argument.

>>> traceWith fst ("hello","world")
hello
("hello","world")

/Since: 4.18.0.0/
-}
traceWith :: (a -> String) -> a -> a
traceWith f a = trace (f a) a

{-|
Like 'traceWith', but uses 'show' on the result of the function to convert it to
a 'String'.

>>> traceShowWith length [1,2,3]
3
[1,2,3]

/Since: 4.18.0.0/
-}
traceShowWith :: Show b => (a -> b) -> a -> a
traceShowWith f = traceWith (show . f)

-- | Like 'traceEvent', but emits the result of calling a function on its
-- argument.
--
-- /Since: 4.18.0.0/
traceEventWith :: (a -> String) -> a -> a
traceEventWith f a = traceEvent (f a) a
#endif