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)