{-# LANGUAGE CPP #-}
module Game.Goatee.Lib.Renderer (
Render,
runRender,
rendererOf,
) where
#if MIN_VERSION_mtl(2,2,1)
import Control.Monad.Except (Except, catchError, runExcept, throwError)
#else
import Control.Monad.Error (catchError, throwError)
#endif
import Control.Monad.Writer (WriterT, execWriterT)
#if MIN_VERSION_mtl(2,2,1)
type Render = WriterT String (Except String)
#else
type Render = WriterT String (Either String)
#endif
runRender :: Render a -> Either String String
#if MIN_VERSION_mtl(2,2,1)
runRender :: Render a -> Either String String
runRender = Except String String -> Either String String
forall e a. Except e a -> Either e a
runExcept (Except String String -> Either String String)
-> (Render a -> Except String String)
-> Render a
-> Either String String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Render a -> Except String String
forall (m :: * -> *) w a. Monad m => WriterT w m a -> m w
execWriterT
#else
runRender = execWriterT
#endif
rendererOf :: Show a => String -> (a -> Render ()) -> a -> Render ()
rendererOf :: String -> (a -> Render ()) -> a -> Render ()
rendererOf String
description a -> Render ()
renderer a
value = Render () -> (String -> Render ()) -> Render ()
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
catchError (a -> Render ()
renderer a
value) ((String -> Render ()) -> Render ())
-> (String -> Render ()) -> Render ()
forall a b. (a -> b) -> a -> b
$ \String
message ->
String -> Render ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (String -> Render ()) -> String -> Render ()
forall a b. (a -> b) -> a -> b
$
String
message String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n while trying to render " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
description String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" from " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
value String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"."