packages feed

log-effect-1.2.0: examples/log.hs

{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
import Control.Concurrent
import Control.Eff
import Control.Eff.Log
import Control.Monad.Trans.Control (MonadBaseControl, liftBaseDiscard)

-- This function is declared in lifted-base package.
fork :: MonadBaseControl IO m => m () -> m ThreadId
fork = liftBaseDiscard forkIO

someComp :: ( [ Log String, LogM IO String ] <:: r
            , LiftedBase IO r
            ) => Eff r ()
someComp = do logE "Hello!"
              logM "Greetings from the main thread!"

              _ <- fork $ do logM "This is a new thread, and this message is still visible."
                             logE "Unfortunately, this one is not."
              return ()

main :: IO ()
main = runLift $ runLog l $ runLogM l $ someComp
  where
    l = stdoutLogger :: Logger IO String