{-# LANGUAGE TypeFamilies #-}
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.Arrow
import Control.Applicative (liftA2)
import Data.String
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 = 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 a b. (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 :: forall a. 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 a. a -> WriterT LaTeX f a
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) = 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 a b.
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 :: forall a. 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 :: forall a. 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 :: forall (m :: * -> *) a. Monad m => 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 (m :: * -> *) a. Monad m => 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
(LaTeXT WriterT LaTeX m a
c) >>= :: forall a b. 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 :: forall a. IO a -> LaTeXT m a
liftIO = m a -> LaTeXT m a
forall (m :: * -> *) a. Monad m => 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 a. 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)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [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 a) -> LaTeXT m a
forall a b. LaTeXT m a -> (a -> LaTeXT m b) -> LaTeXT m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= LaTeX -> LaTeXT m a
LaTeX -> LaTeXT m ()
forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell (LaTeX -> LaTeXT m a)
-> ([LaTeX] -> LaTeX) -> [LaTeX] -> LaTeXT m a
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 = 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 :: forall (m :: * -> *) a. Monad m => LaTeXT m a -> m LaTeX
execLaTeXT = ((a, LaTeX) -> LaTeX) -> m (a, LaTeX) -> m LaTeX
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (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 :: forall (m :: * -> *) a.
Monad m =>
LaTeXT m a -> m (LaTeX, [Warning])
execLaTeXTWarn = (LaTeX -> (LaTeX, [Warning])) -> m LaTeX -> m (LaTeX, [Warning])
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (LaTeX -> LaTeX
forall a. a -> a
id (LaTeX -> LaTeX)
-> (LaTeX -> [Warning]) -> LaTeX -> (LaTeX, [Warning])
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
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 (m :: * -> *) a. Monad m => m a -> WriterT LaTeX m a
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 a b. (a -> b) -> LaTeXT m a -> LaTeXT m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (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 :: forall (m :: * -> *). Monad m => 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 :: forall (m :: * -> *) a.
Monad m =>
(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 (m :: * -> *) a. Monad m => m a -> WriterT LaTeX m a
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 a. 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 :: 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') = 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 (m :: * -> *) a. Monad m => m a -> WriterT LaTeX m a
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 (m :: * -> *) a. Monad m => m a -> WriterT LaTeX m a
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 a. a -> WriterT LaTeX m a
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 = 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 :: forall a (m :: * -> *). (Render a, Monad m) => 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 a
LaTeX -> LaTeXT m ()
forall (m :: * -> *). Monad m => LaTeX -> LaTeXT m ()
textell (LaTeX -> LaTeXT m a) -> (String -> LaTeX) -> String -> LaTeXT m a
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 a. a -> LaTeXT m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
forall a. Monoid a => a
mempty
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 a b c.
(a -> b -> c) -> LaTeXT m a -> LaTeXT m b -> LaTeXT m c
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.<>)