Created
November 11, 2019 13:59
-
-
Save andrevdm/136cdbbb4c244b0ebedf70b7d7c8b99e to your computer and use it in GitHub Desktop.
Polysemy intercept e.g
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# LANGUAGE NoImplicitPrelude #-} | |
{-# LANGUAGE DeriveGeneric #-} | |
{-# LANGUAGE DeriveAnyClass #-} | |
{-# LANGUAGE OverloadedStrings #-} | |
{-# LANGUAGE TemplateHaskell #-} | |
{-# LANGUAGE DataKinds #-} | |
{-# LANGUAGE FlexibleContexts #-} | |
{-# LANGUAGE GADTs #-} | |
{-# LANGUAGE LambdaCase #-} | |
{-# LANGUAGE PolyKinds #-} | |
{-# LANGUAGE RankNTypes #-} | |
{-# LANGUAGE ScopedTypeVariables #-} | |
{-# LANGUAGE TypeApplications #-} | |
{-# LANGUAGE TypeFamilies #-} | |
{-# LANGUAGE TypeOperators #-} | |
module Main (main) where | |
import Protolude | |
import Polysemy (makeSem, Members, Sem, Embed, embed) | |
import qualified Polysemy as P | |
------------------------------------------------------------------------------------------ | |
data LogEff m a where | |
LogIt :: Text -> LogEff m () | |
makeSem ''LogEff | |
interpretLogEff :: forall r a. | |
Members '[Embed IO | |
] r | |
=> Sem (LogEff ': r) a | |
-> Sem r a | |
interpretLogEff = P.interpret $ \case | |
LogIt t -> embed @IO . putText $ "l: " <> t | |
------------------------------------------------------------------------------------------ | |
------------------------------------------------------------------------------------------ | |
data TestEff m a where | |
TestIt :: Text -> TestEff m () | |
makeSem ''TestEff | |
interpretTestEff :: forall r a. | |
Members '[ LogEff | |
] r | |
=> Sem (TestEff ': r) a | |
-> Sem r a | |
interpretTestEff = P.interpret $ \case | |
TestIt t -> logIt $ "tt: " <> t | |
------------------------------------------------------------------------------------------ | |
------------------------------------------------------------------------------------------ | |
withLogExtra :: forall r a. | |
Members '[ LogEff | |
, Embed IO | |
] r | |
=> Sem r a | |
-> Sem r a | |
withLogExtra = P.intercept $ \case | |
LogIt t -> do | |
putText $ "extra: " <> t | |
logIt t | |
------------------------------------------------------------------------------------------ | |
main :: IO () | |
main = do | |
P.runM @IO | |
. interpretLogEff | |
. withLogExtra | |
. interpretTestEff | |
$ go | |
where | |
go = do | |
logIt "123" | |
testIt "aa" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment