{-# 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 { forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT :: WriterT LaTeX m a }
instance Functor f => Functor (LaTeXT f) where
fmap :: forall a b. (a -> b) -> LaTeXT f a -> LaTeXT f b
fmap a -> b
f = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT
instance Applicative f => Applicative (LaTeXT f) where
pure :: forall a. a -> LaTeXT f a
pure = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
(LaTeXT WriterT LaTeX f (a -> b)
f) <*> :: forall a b. LaTeXT f (a -> b) -> LaTeXT f a -> LaTeXT f b
<*> (LaTeXT WriterT LaTeX f a
x) = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall a b. (a -> b) -> a -> b
$ WriterT LaTeX f (a -> b)
f 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 :: forall a. LaTeXM a -> (a, LaTeX)
runLaTeXM = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. LaTeXT m a -> m (a, LaTeX)
runLaTeXT
execLaTeXM :: LaTeXM a -> LaTeX
execLaTeXM :: forall a. LaTeXM a -> LaTeX
execLaTeXM = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => LaTeXT m a -> m LaTeX
execLaTeXT
instance MonadTrans LaTeXT where
lift :: forall (m :: * -> *) a. Monad m => m a -> LaTeXT m a
lift = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift
instance Monad m => Monad (LaTeXT m) where
return :: forall a. a -> LaTeXT m a
return = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => a -> m a
return
(LaTeXT WriterT LaTeX m a
c) >>= :: forall a b. LaTeXT m a -> (a -> LaTeXT m b) -> LaTeXT m b
>>= a -> LaTeXT m b
f = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT 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 :: forall a. IO a -> LaTeXT m a
liftIO = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall (m :: * -> *) a. Monad m => LaTeXT m a -> LaTeXT m LaTeX
extractLaTeX_ [LaTeXT m a]
xs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell forall b c a. (b -> c) -> (a -> b) -> a -> c
. [LaTeX] -> LaTeX
f
runLaTeXT :: LaTeXT m a -> m (a,LaTeX)
runLaTeXT :: forall (m :: * -> *) a. LaTeXT m a -> m (a, LaTeX)
runLaTeXT = forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT
execLaTeXT :: Monad m => LaTeXT m a -> m LaTeX
execLaTeXT :: forall (m :: * -> *) a. Monad m => LaTeXT m a -> m LaTeX
execLaTeXT = forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. LaTeXT m a -> m (a, LaTeX)
runLaTeXT
execLaTeXTWarn :: Monad m => LaTeXT m a -> m (LaTeX,[Warning])
execLaTeXTWarn :: forall (m :: * -> *) a.
Monad m =>
LaTeXT m a -> m (LaTeX, [Warning])
execLaTeXTWarn = forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (forall a. a -> a
id forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& TeXCheck -> LaTeX -> [Warning]
check TeXCheck
checkAll) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => LaTeXT m a -> m LaTeX
execLaTeXT
extractLaTeX :: Monad m => LaTeXT m a -> LaTeXT m (a,LaTeX)
= forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT
extractLaTeX_ :: Monad m => LaTeXT m a -> LaTeXT m LaTeX
= forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a.
Monad m =>
LaTeXT m a -> LaTeXT m (a, LaTeX)
extractLaTeX
textell :: Monad m => LaTeX -> LaTeXT m ()
textell :: forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell
liftFun :: Monad m
=> (LaTeX -> LaTeX)
-> (LaTeXT m a -> LaTeXT m a)
liftFun :: forall (m :: * -> *) a.
Monad m =>
(LaTeX -> LaTeX) -> LaTeXT m a -> LaTeXT m a
liftFun LaTeX -> LaTeX
f (LaTeXT WriterT LaTeX m a
c) = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall a b. (a -> b) -> a -> b
$ do
(a
p,LaTeX
l) <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT WriterT LaTeX m a
c
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell forall a b. (a -> b) -> a -> b
$ LaTeX -> LaTeX
f LaTeX
l
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 :: forall (m :: * -> *) a b.
Monad m =>
(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') = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall a b. (a -> b) -> a -> b
$ do
(a
_,LaTeX
l) <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT WriterT LaTeX m a
c
(b
p,LaTeX
l') <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT WriterT LaTeX m b
c'
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell forall a b. (a -> b) -> a -> b
$ LaTeX
l LaTeX -> LaTeX -> LaTeX
`op` LaTeX
l'
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 :: forall (m :: * -> *) a.
(m (a, LaTeX) -> m (a, LaTeX)) -> LaTeXT m a -> LaTeXT m a
mapLaTeXT m (a, LaTeX) -> m (a, LaTeX)
f = forall (m :: * -> *) a. WriterT LaTeX m a -> LaTeXT m a
LaTeXT forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. LaTeXT m a -> WriterT LaTeX m a
unwrapLaTeXT
rendertexM :: (Render a, Monad m) => a -> LaTeXT m ()
rendertexM :: forall a (m :: * -> *). (Render a, Monad m) => a -> LaTeXT m ()
rendertexM = forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
fromString
instance (Monad m, Monoid a) => Monoid (LaTeXT m a) where
mempty :: LaTeXT m a
mempty = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Monoid a => a
mempty
mappend :: LaTeXT m a -> LaTeXT m a -> LaTeXT m a
mappend = forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 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
(<>) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Semigroup a => a -> a -> a
(Semigroup.<>)