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