{-# LANGUAGE TypeFamilies, CPP #-}
module Text.LaTeX.Base.Writer
(
LaTeXT
, runLaTeXT
, execLaTeXT
, LaTeXT_
, LaTeXM
, runLaTeXM
, execLaTeXM
, execLaTeXTWarn
, extractLaTeX
, extractLaTeX_
, textell
, rendertexM
, liftFun
, liftOp
, mapLaTeXT
, lift
, liftIO
) where
import Control.Monad (liftM, liftM2)
import Control.Arrow
import Data.String
#if !MIN_VERSION_base(4,8,0)
import Data.Monoid
#endif
import Control.Applicative
import qualified Data.Semigroup as Semigroup
import Control.Monad.Trans.Writer
import Control.Monad.IO.Class
import Control.Monad.Trans.Class
import Data.Functor.Identity
import Text.LaTeX.Base.Syntax
import Text.LaTeX.Base.Class
import Text.LaTeX.Base.Render
import Text.LaTeX.Base.Warnings (Warning,checkAll,check)
newtype LaTeXT m a = LaTeXT { LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT :: WriterT LaTeX m a }
instance Functor f => Functor (LaTeXT f) where
fmap :: (a -> b) -> LaTeXT f a -> LaTeXT f b
fmap a -> b
f = WriterT LaTeX f b -> LaTeXT f b
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX f b -> LaTeXT f b)
-> (LaTeXT f a -> WriterT LaTeX f b) -> LaTeXT f a -> LaTeXT f b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b) -> WriterT LaTeX f a -> WriterT LaTeX f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (WriterT LaTeX f a -> WriterT LaTeX f b)
-> (LaTeXT f a -> WriterT LaTeX f a)
-> LaTeXT f a
-> WriterT LaTeX f b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXT f a -> WriterT LaTeX f a
forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT
instance Applicative f => Applicative (LaTeXT f) where
pure :: a -> LaTeXT f a
pure = WriterT LaTeX f a -> LaTeXT f a
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX f a -> LaTeXT f a)
-> (a -> WriterT LaTeX f a) -> a -> LaTeXT f a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> WriterT LaTeX f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
(LaTeXT WriterT LaTeX f (a -> b)
f) <*> :: LaTeXT f (a -> b) -> LaTeXT f a -> LaTeXT f b
<*> (LaTeXT WriterT LaTeX f a
x) = WriterT LaTeX f b -> LaTeXT f b
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX f b -> LaTeXT f b)
-> WriterT LaTeX f b -> LaTeXT f b
forall a b. (a -> b) -> a -> b
$ WriterT LaTeX f (a -> b)
f WriterT LaTeX f (a -> b) -> WriterT LaTeX f a -> WriterT LaTeX f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> WriterT LaTeX f a
x
type LaTeXT_ m = LaTeXT m ()
type LaTeXM = LaTeXT Identity
runLaTeXM :: LaTeXM a -> (a, LaTeX)
runLaTeXM :: LaTeXM a -> (a, LaTeX)
runLaTeXM = Identity (a, LaTeX) -> (a, LaTeX)
forall a. Identity a -> a
runIdentity (Identity (a, LaTeX) -> (a, LaTeX))
-> (LaTeXM a -> Identity (a, LaTeX)) -> LaTeXM a -> (a, LaTeX)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXM a -> Identity (a, LaTeX)
forall (m :: * -> *) a. LaTeXT m a -> m (a, LaTeX)
runLaTeXT
execLaTeXM :: LaTeXM a -> LaTeX
execLaTeXM :: LaTeXM a -> LaTeX
execLaTeXM = Identity LaTeX -> LaTeX
forall a. Identity a -> a
runIdentity (Identity LaTeX -> LaTeX)
-> (LaTeXM a -> Identity LaTeX) -> LaTeXM a -> LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXM a -> Identity LaTeX
forall (m :: * -> *) a. Monad m => LaTeXT m a -> m LaTeX
execLaTeXT
instance MonadTrans LaTeXT where
lift :: m a -> LaTeXT m a
lift = WriterT LaTeX m a -> LaTeXT m a
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX m a -> LaTeXT m a)
-> (m a -> WriterT LaTeX m a) -> m a -> LaTeXT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> WriterT LaTeX m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift
instance Monad m => Monad (LaTeXT m) where
return :: a -> LaTeXT m a
return = WriterT LaTeX m a -> LaTeXT m a
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX m a -> LaTeXT m a)
-> (a -> WriterT LaTeX m a) -> a -> LaTeXT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> WriterT LaTeX m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(LaTeXT WriterT LaTeX m a
c) >>= :: LaTeXT m a -> (a -> LaTeXT m b) -> LaTeXT m b
>>= a -> LaTeXT m b
f = WriterT LaTeX m b -> LaTeXT m b
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX m b -> LaTeXT m b)
-> WriterT LaTeX m b -> LaTeXT m b
forall a b. (a -> b) -> a -> b
$ do
a
a <- WriterT LaTeX m a
c
let LaTeXT WriterT LaTeX m b
c' = a -> LaTeXT m b
f a
a
WriterT LaTeX m b
c'
instance MonadIO m => MonadIO (LaTeXT m) where
liftIO :: IO a -> LaTeXT m a
liftIO = m a -> LaTeXT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> LaTeXT m a) -> (IO a -> m a) -> IO a -> LaTeXT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
instance (Monad m, a ~ ()) => LaTeXC (LaTeXT m a) where
liftListL :: ([LaTeX] -> LaTeX) -> [LaTeXT m a] -> LaTeXT m a
liftListL [LaTeX] -> LaTeX
f [LaTeXT m a]
xs = (LaTeXT m a -> LaTeXT m LaTeX) -> [LaTeXT m a] -> LaTeXT m [LaTeX]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM LaTeXT m a -> LaTeXT m LaTeX
forall (m :: * -> *) a. Monad m => LaTeXT m a -> LaTeXT m LaTeX
extractLaTeX_ [LaTeXT m a]
xs LaTeXT m [LaTeX] -> ([LaTeX] -> LaTeXT m ()) -> LaTeXT m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= LaTeX -> LaTeXT m ()
forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell (LaTeX -> LaTeXT m ())
-> ([LaTeX] -> LaTeX) -> [LaTeX] -> LaTeXT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [LaTeX] -> LaTeX
f
runLaTeXT :: LaTeXT m a -> m (a,LaTeX)
runLaTeXT :: LaTeXT m a -> m (a, LaTeX)
runLaTeXT = WriterT LaTeX m a -> m (a, LaTeX)
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT (WriterT LaTeX m a -> m (a, LaTeX))
-> (LaTeXT m a -> WriterT LaTeX m a) -> LaTeXT m a -> m (a, LaTeX)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXT m a -> WriterT LaTeX m a
forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT
execLaTeXT :: Monad m => LaTeXT m a -> m LaTeX
execLaTeXT :: LaTeXT m a -> m LaTeX
execLaTeXT = ((a, LaTeX) -> LaTeX) -> m (a, LaTeX) -> m LaTeX
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (a, LaTeX) -> LaTeX
forall a b. (a, b) -> b
snd (m (a, LaTeX) -> m LaTeX)
-> (LaTeXT m a -> m (a, LaTeX)) -> LaTeXT m a -> m LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXT m a -> m (a, LaTeX)
forall (m :: * -> *) a. LaTeXT m a -> m (a, LaTeX)
runLaTeXT
execLaTeXTWarn :: Monad m => LaTeXT m a -> m (LaTeX,[Warning])
execLaTeXTWarn :: LaTeXT m a -> m (LaTeX, [Warning])
execLaTeXTWarn = (LaTeX -> (LaTeX, [Warning])) -> m LaTeX -> m (LaTeX, [Warning])
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (LaTeX -> LaTeX
forall a. a -> a
id (LaTeX -> LaTeX)
-> (LaTeX -> [Warning]) -> LaTeX -> (LaTeX, [Warning])
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& TeXCheck -> LaTeX -> [Warning]
check TeXCheck
checkAll) (m LaTeX -> m (LaTeX, [Warning]))
-> (LaTeXT m a -> m LaTeX) -> LaTeXT m a -> m (LaTeX, [Warning])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXT m a -> m LaTeX
forall (m :: * -> *) a. Monad m => LaTeXT m a -> m LaTeX
execLaTeXT
extractLaTeX :: Monad m => LaTeXT m a -> LaTeXT m (a,LaTeX)
= WriterT LaTeX m (a, LaTeX) -> LaTeXT m (a, LaTeX)
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX m (a, LaTeX) -> LaTeXT m (a, LaTeX))
-> (LaTeXT m a -> WriterT LaTeX m (a, LaTeX))
-> LaTeXT m a
-> LaTeXT m (a, LaTeX)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m (a, LaTeX) -> WriterT LaTeX m (a, LaTeX)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, LaTeX) -> WriterT LaTeX m (a, LaTeX))
-> (LaTeXT m a -> m (a, LaTeX))
-> LaTeXT m a
-> WriterT LaTeX m (a, LaTeX)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterT LaTeX m a -> m (a, LaTeX)
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT (WriterT LaTeX m a -> m (a, LaTeX))
-> (LaTeXT m a -> WriterT LaTeX m a) -> LaTeXT m a -> m (a, LaTeX)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXT m a -> WriterT LaTeX m a
forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT
extractLaTeX_ :: Monad m => LaTeXT m a -> LaTeXT m LaTeX
= ((a, LaTeX) -> LaTeX) -> LaTeXT m (a, LaTeX) -> LaTeXT m LaTeX
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (a, LaTeX) -> LaTeX
forall a b. (a, b) -> b
snd (LaTeXT m (a, LaTeX) -> LaTeXT m LaTeX)
-> (LaTeXT m a -> LaTeXT m (a, LaTeX))
-> LaTeXT m a
-> LaTeXT m LaTeX
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXT m a -> LaTeXT m (a, LaTeX)
forall (m :: * -> *) a.
Monad m =>
LaTeXT m a -> LaTeXT m (a, LaTeX)
extractLaTeX
textell :: Monad m => LaTeX -> LaTeXT m ()
textell :: LaTeX -> LaTeXT m ()
textell = WriterT LaTeX m () -> LaTeXT m ()
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX m () -> LaTeXT m ())
-> (LaTeX -> WriterT LaTeX m ()) -> LaTeX -> LaTeXT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeX -> WriterT LaTeX m ()
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell
liftFun :: Monad m
=> (LaTeX -> LaTeX)
-> (LaTeXT m a -> LaTeXT m a)
liftFun :: (LaTeX -> LaTeX) -> LaTeXT m a -> LaTeXT m a
liftFun LaTeX -> LaTeX
f (LaTeXT WriterT LaTeX m a
c) = WriterT LaTeX m a -> LaTeXT m a
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX m a -> LaTeXT m a)
-> WriterT LaTeX m a -> LaTeXT m a
forall a b. (a -> b) -> a -> b
$ do
(a
p,LaTeX
l) <- m (a, LaTeX) -> WriterT LaTeX m (a, LaTeX)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, LaTeX) -> WriterT LaTeX m (a, LaTeX))
-> m (a, LaTeX) -> WriterT LaTeX m (a, LaTeX)
forall a b. (a -> b) -> a -> b
$ WriterT LaTeX m a -> m (a, LaTeX)
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT WriterT LaTeX m a
c
LaTeX -> WriterT LaTeX m ()
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell (LaTeX -> WriterT LaTeX m ()) -> LaTeX -> WriterT LaTeX m ()
forall a b. (a -> b) -> a -> b
$ LaTeX -> LaTeX
f LaTeX
l
a -> WriterT LaTeX m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
p
liftOp :: Monad m
=> (LaTeX -> LaTeX -> LaTeX)
-> (LaTeXT m a -> LaTeXT m b -> LaTeXT m b)
liftOp :: (LaTeX -> LaTeX -> LaTeX) -> LaTeXT m a -> LaTeXT m b -> LaTeXT m b
liftOp LaTeX -> LaTeX -> LaTeX
op (LaTeXT WriterT LaTeX m a
c) (LaTeXT WriterT LaTeX m b
c') = WriterT LaTeX m b -> LaTeXT m b
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX m b -> LaTeXT m b)
-> WriterT LaTeX m b -> LaTeXT m b
forall a b. (a -> b) -> a -> b
$ do
(a
_,LaTeX
l) <- m (a, LaTeX) -> WriterT LaTeX m (a, LaTeX)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, LaTeX) -> WriterT LaTeX m (a, LaTeX))
-> m (a, LaTeX) -> WriterT LaTeX m (a, LaTeX)
forall a b. (a -> b) -> a -> b
$ WriterT LaTeX m a -> m (a, LaTeX)
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT WriterT LaTeX m a
c
(b
p,LaTeX
l') <- m (b, LaTeX) -> WriterT LaTeX m (b, LaTeX)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (b, LaTeX) -> WriterT LaTeX m (b, LaTeX))
-> m (b, LaTeX) -> WriterT LaTeX m (b, LaTeX)
forall a b. (a -> b) -> a -> b
$ WriterT LaTeX m b -> m (b, LaTeX)
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT WriterT LaTeX m b
c'
LaTeX -> WriterT LaTeX m ()
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell (LaTeX -> WriterT LaTeX m ()) -> LaTeX -> WriterT LaTeX m ()
forall a b. (a -> b) -> a -> b
$ LaTeX
l LaTeX -> LaTeX -> LaTeX
`op` LaTeX
l'
b -> WriterT LaTeX m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
p
mapLaTeXT :: (m (a, LaTeX) -> m (a, LaTeX)) -> LaTeXT m a -> LaTeXT m a
mapLaTeXT :: (m (a, LaTeX) -> m (a, LaTeX)) -> LaTeXT m a -> LaTeXT m a
mapLaTeXT m (a, LaTeX) -> m (a, LaTeX)
f = WriterT LaTeX m a -> LaTeXT m a
forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT (WriterT LaTeX m a -> LaTeXT m a)
-> (LaTeXT m a -> WriterT LaTeX m a) -> LaTeXT m a -> LaTeXT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (m (a, LaTeX) -> m (a, LaTeX))
-> WriterT LaTeX m a -> WriterT LaTeX m a
forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
mapWriterT m (a, LaTeX) -> m (a, LaTeX)
f (WriterT LaTeX m a -> WriterT LaTeX m a)
-> (LaTeXT m a -> WriterT LaTeX m a)
-> LaTeXT m a
-> WriterT LaTeX m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LaTeXT m a -> WriterT LaTeX m a
forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT
rendertexM :: (Render a, Monad m) => a -> LaTeXT m ()
rendertexM :: a -> LaTeXT m ()
rendertexM = LaTeX -> LaTeXT m ()
forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell (LaTeX -> LaTeXT m ()) -> (a -> LaTeX) -> a -> LaTeXT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> LaTeX
forall a l. (Render a, LaTeXC l) => a -> l
rendertex
instance (Monad m, a ~ ()) => IsString (LaTeXT m a) where
fromString :: String -> LaTeXT m a
fromString = LaTeX -> LaTeXT m ()
forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell (LaTeX -> LaTeXT m ())
-> (String -> LaTeX) -> String -> LaTeXT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> LaTeX
forall a. IsString a => String -> a
fromString
instance (Monad m, Monoid a) => Monoid (LaTeXT m a) where
mempty :: LaTeXT m a
mempty = a -> LaTeXT m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
forall a. Monoid a => a
mempty
mappend :: LaTeXT m a -> LaTeXT m a -> LaTeXT m a
mappend = (a -> a -> a) -> LaTeXT m a -> LaTeXT m a -> LaTeXT m a
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 a -> a -> a
forall a. Monoid a => a -> a -> a
mappend
instance (Applicative m, Semigroup.Semigroup a) => Semigroup.Semigroup (LaTeXT m a) where
<> :: LaTeXT m a -> LaTeXT m a -> LaTeXT m a
(<>) = (a -> a -> a) -> LaTeXT m a -> LaTeXT m a -> LaTeXT m a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> a -> a
forall a. Semigroup a => a -> a -> a
(Semigroup.<>)