module Effectful.Zoo.DataLog.Data.LogEntry
  ( LogEntry(..),
    annotate,
  ) where

import Data.Time (UTCTime)
import Data.Time.Clock qualified as IO
import Effectful
import Effectful.Zoo.Core
import GHC.Stack qualified as GHC
import HaskellWorks.Prelude

data LogEntry a = LogEntry
  { forall a. LogEntry a -> a
message :: !a
  , forall a. LogEntry a -> UTCTime
time :: !UTCTime
  , forall a. LogEntry a -> CallStack
source :: !CallStack
  }
  deriving stock ((forall x. LogEntry a -> Rep (LogEntry a) x)
-> (forall x. Rep (LogEntry a) x -> LogEntry a)
-> Generic (LogEntry a)
forall x. Rep (LogEntry a) x -> LogEntry a
forall x. LogEntry a -> Rep (LogEntry a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (LogEntry a) x -> LogEntry a
forall a x. LogEntry a -> Rep (LogEntry a) x
$cfrom :: forall a x. LogEntry a -> Rep (LogEntry a) x
from :: forall x. LogEntry a -> Rep (LogEntry a) x
$cto :: forall a x. Rep (LogEntry a) x -> LogEntry a
to :: forall x. Rep (LogEntry a) x -> LogEntry a
Generic, Int -> LogEntry a -> ShowS
[LogEntry a] -> ShowS
LogEntry a -> String
(Int -> LogEntry a -> ShowS)
-> (LogEntry a -> String)
-> ([LogEntry a] -> ShowS)
-> Show (LogEntry a)
forall a. Show a => Int -> LogEntry a -> ShowS
forall a. Show a => [LogEntry a] -> ShowS
forall a. Show a => LogEntry a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> LogEntry a -> ShowS
showsPrec :: Int -> LogEntry a -> ShowS
$cshow :: forall a. Show a => LogEntry a -> String
show :: LogEntry a -> String
$cshowList :: forall a. Show a => [LogEntry a] -> ShowS
showList :: [LogEntry a] -> ShowS
Show)

annotate :: ()
  => HasCallStack
  => r <: IOE
  => a
  -> Eff r (LogEntry a)
annotate :: forall (r :: [Effect]) a.
(HasCallStack, r <: IOE) =>
a -> Eff r (LogEntry a)
annotate a
msg = do
  UTCTime
time <- IO UTCTime -> Eff r UTCTime
forall a. IO a -> Eff r a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO UTCTime
IO.getCurrentTime
  pure (a -> UTCTime -> CallStack -> LogEntry a
forall a. a -> UTCTime -> CallStack -> LogEntry a
LogEntry a
msg UTCTime
time CallStack
HasCallStack => CallStack
GHC.callStack)