{-# LANGUAGE OverloadedStrings #-}
module Testing.CurlRunnings.Internal
( makeRed
, makeGreen
, tracer
, mapRight
, mapLeft
, arrayGet
, makeLogger
, makeUnsafeLogger
, pShow
, LogLevel(..)
, CurlRunningsLogger
, CurlRunningsUnsafeLogger
) where
import Control.Monad
import Data.Monoid
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Debug.Trace
import qualified Text.Pretty.Simple as P
makeGreen :: T.Text -> T.Text
makeGreen s = "\x1B[32m" <> s <> "\x1B[0m"
makeRed :: T.Text -> T.Text
makeRed s = "\x1B[31m" <> s <> "\x1B[0m"
pShow :: Show a => a -> T.Text
pShow = TL.toStrict . P.pShow
tracer :: Show a => T.Text -> a -> a
tracer a b = trace (T.unpack $ a <> T.pack ": " <> pShow b) b
mapRight :: (b -> c) -> Either a b -> Either a c
mapRight f (Right v) = Right $ f v
mapRight _ (Left v) = Left v
mapLeft :: (a -> c) -> Either a b -> Either c b
mapLeft f (Left v) = Left $ f v
mapLeft _ (Right v) = Right v
arrayGet :: [a] -> Int -> Maybe a
arrayGet a i
| (i >= 0 && length a <= abs i) || null a || (i < 0 && length a <= (abs i - 1)) = Nothing
| i >= 0 = Just $ a !! i
| otherwise = Just $ a !! (length a + i)
data LogLevel
= ERROR
| INFO
| DEBUG
deriving (Show, Eq, Ord, Enum)
type CurlRunningsLogger = (LogLevel -> T.Text -> IO ())
type CurlRunningsUnsafeLogger a = (LogLevel -> T.Text -> a -> a)
makeLogger :: LogLevel -> CurlRunningsLogger
makeLogger threshold level text = when (level <= threshold) $ P.pPrint text
makeUnsafeLogger :: Show a => LogLevel -> CurlRunningsUnsafeLogger a
makeUnsafeLogger threshold level text object =
if level <= threshold
then tracer text object
else object