axel-0.0.13: test/Axel/Test/Eff/ConsoleMock.hs
{-# LANGUAGE TemplateHaskell #-}
module Axel.Test.Eff.ConsoleMock where
import Axel.Prelude
import Axel.Eff.Console as Effs
import Control.Lens
import Effectful ((:>))
import qualified Effectful as Eff
import qualified Effectful.Dispatch.Dynamic as Eff
import qualified Effectful.Error.Static as Eff
import qualified Effectful.State.Static.Local as Eff
import TestUtils
newtype ConsoleState =
ConsoleState
{ _consoleOutput :: Text
}
deriving (Eq, Show)
makeFieldsNoPrefix ''ConsoleState
mkConsoleState :: ConsoleState
mkConsoleState = ConsoleState {_consoleOutput = ""}
runConsole ::
forall effs a. (Eff.Error Text :> effs)
=> ConsoleState
-> Eff.Eff (Effs.Console ': effs) a
-> Eff.Eff effs (a, ConsoleState)
runConsole origState = Eff.reinterpret (Eff.runState origState) (const go)
where
go :: Console m b -> Eff.Eff (Eff.State ConsoleState ': effs) b
go GetTerminalSize =
throwInterpretError "GetTerminalSize" "Not implemented!"
go (PutStr str) = Eff.modify $ consoleOutput %~ (<> str)