content: module Tintin.Capabilities.Logging
    ( Logging
    , Capability
    , log
    , err
    , debug
  
    , stdOut
    , mute
    )
  where
  
  import Tintin.Core
  import Tintin.Capabilities
  
  data Logging
  
  {- |
  Capability for our context to be able to log from any place where it is available:
  
  @
  foo :: Has Logging.Capability e
      => Effectful e ()
  foo = do
    log "Something happened :("
    ...
  @
  -}
  data Capability = Capability
    { _log   :: Text -> IO ()
    , _err   :: Text -> IO ()
    , _debug :: Text -> IO ()
    }
  
  
  -- | Logs a text message using the available logger
  log :: Has Capability e
      => Text
      -> Effectful e ()
  log = liftCapability _log
  
  
  -- | Logs an error message using the available logger
  err :: Has Capability e
      => Text
      -> Effectful e ()
  err = liftCapability _err
  
  
  -- | Logs a debug message using the available logger
  debug :: Has Capability e
        => Text
        -> Effectful e ()
  debug = liftCapability _debug
  
  
  -- | Creates a logger that just prints things to STDOUT
  stdOut :: Capability
  stdOut = Capability
    { _log   = putTextLn
    , _err   = putTextLn . ("[ERROR] - " <>)
    , _debug = putTextLn . ("[DEBUG] - " <>)
    }
  
  
  -- | Creates a logger that does literally nothing
  mute :: Capability
  mute = Capability
    { _log = return . const ()
    , _debug = return . const ()
    , _err   = putTextLn . ("[ERROR] - " <>)
    }
  