--------------------------------------------------------------------------------

-- | Utility functions for producing and writing error logs.
--
module Codeforces.Logging where

--------------------------------------------------------------------------------

-- | Contains a brief, user-friendly error message and potential loggable data.
data ErrorLog = ErrorLog
    { ErrorLog -> String
elErrorMsg :: String
    , ErrorLog -> Maybe String
elErrorLog :: Maybe String
    }
    deriving Int -> ErrorLog -> ShowS
[ErrorLog] -> ShowS
ErrorLog -> String
(Int -> ErrorLog -> ShowS)
-> (ErrorLog -> String) -> ([ErrorLog] -> ShowS) -> Show ErrorLog
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ErrorLog] -> ShowS
$cshowList :: [ErrorLog] -> ShowS
show :: ErrorLog -> String
$cshow :: ErrorLog -> String
showsPrec :: Int -> ErrorLog -> ShowS
$cshowsPrec :: Int -> ErrorLog -> ShowS
Show

-- | Produces an error and log using a single error message.
mkErrorLog :: String -> ErrorLog
mkErrorLog :: String -> ErrorLog
mkErrorLog = (String -> Maybe String -> ErrorLog)
-> Maybe String -> String -> ErrorLog
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> Maybe String -> ErrorLog
ErrorLog Maybe String
forall a. Maybe a
Nothing

-- | Takes an error message and error details and produces a pair of the message
-- and full error details.
(<~>) :: String -> String -> ErrorLog
<~> :: String -> String -> ErrorLog
(<~>) String
msg String
details = String -> Maybe String -> ErrorLog
ErrorLog String
msg (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
msg String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
details)

--------------------------------------------------------------------------------