heftia-effects-0.6.0.0: Example/Writer/Main.hs
-- SPDX-License-Identifier: MPL-2.0
module Main where
import Control.Monad.Hefty (Eff, liftIO, runEff, type (:>))
import Control.Monad.Hefty.Writer (runTell, runWriterHPost, runWriterHPre)
import Data.Effect.Writer (Tell, WriterH, censor, tell)
hello :: (Tell String :> es) => Eff es ()
hello = do
tell "Hello"
tell " world!"
censorHello :: (Tell String :> es, WriterH String :> es) => Eff es ()
censorHello =
censor
( \s ->
if s == "Hello"
then "Goodbye"
else
if s == "Hello world!"
then "Hello world!!"
else s
)
hello
main :: IO ()
main = runEff do
(sPre, _) <-
runTell
. runWriterHPre @String
$ censorHello
(sPost, _) <-
runTell
. runWriterHPost @String
$ censorHello
liftIO $ putStrLn $ "Pre-applying: " <> sPre
liftIO $ putStrLn $ "Post-applying: " <> sPost
{-
Pre-applying: Goodbye world!
Post-applying: Hello world!!
-}