{-# LANGUAGE ScopedTypeVariables #-}
module Language.Ltml.Parser.Footnote.Combinators
( withSucceedingFootnotes
, manyWithFootnotesTillSucc
)
where
import Control.Applicative ((<|>))
import Control.Monad.Trans.Class (lift)
import Data.Maybe (catMaybes)
import Language.Ltml.Parser (Parser)
import Language.Ltml.Parser.Common.Combinators (manyTillSucc)
import Language.Ltml.Parser.Common.Lexeme (nLexeme)
import Language.Ltml.Parser.Footnote (FootnoteParser, footnoteP)
import Text.Megaparsec (many)
withSucceedingFootnotes :: Parser a -> FootnoteParser a
Parser a
p = Parser a -> FootnoteWriterT Parser a
forall (m :: * -> *) a. Monad m => m a -> FootnoteWriterT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift Parser a
p FootnoteWriterT Parser a
-> FootnoteWriterT Parser [()] -> FootnoteWriterT Parser a
forall a b.
FootnoteWriterT Parser a
-> FootnoteWriterT Parser b -> FootnoteWriterT Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* FootnoteWriterT Parser () -> FootnoteWriterT Parser [()]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many (FootnoteWriterT Parser () -> FootnoteWriterT Parser ()
forall (m :: * -> *) a. MonadParser m => m a -> m a
nLexeme FootnoteWriterT Parser ()
footnoteP)
manyWithFootnotesTillSucc
:: forall a
. Parser a
-> Parser ()
-> FootnoteParser [a]
Parser a
p Parser ()
end =
[Maybe a] -> [a]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe a] -> [a])
-> FootnoteWriterT Parser [Maybe a] -> FootnoteWriterT Parser [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FootnoteWriterT Parser (Maybe a)
-> FootnoteWriterT Parser () -> FootnoteWriterT Parser [Maybe a]
forall (m :: * -> *) a end. MonadParser m => m a -> m end -> m [a]
manyTillSucc (FootnoteWriterT Parser (Maybe a)
-> FootnoteWriterT Parser (Maybe a)
forall (m :: * -> *) a. MonadParser m => m a -> m a
nLexeme FootnoteWriterT Parser (Maybe a)
elemP) (Parser () -> FootnoteWriterT Parser ()
forall (m :: * -> *) a. Monad m => m a -> FootnoteWriterT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift Parser ()
end)
where
elemP :: FootnoteParser (Maybe a)
elemP :: FootnoteWriterT Parser (Maybe a)
elemP =
Maybe a
forall a. Maybe a
Nothing Maybe a
-> FootnoteWriterT Parser () -> FootnoteWriterT Parser (Maybe a)
forall a b.
a -> FootnoteWriterT Parser b -> FootnoteWriterT Parser a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ FootnoteWriterT Parser ()
footnoteP
FootnoteWriterT Parser (Maybe a)
-> FootnoteWriterT Parser (Maybe a)
-> FootnoteWriterT Parser (Maybe a)
forall a.
FootnoteWriterT Parser a
-> FootnoteWriterT Parser a -> FootnoteWriterT Parser a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a)
-> FootnoteWriterT Parser a -> FootnoteWriterT Parser (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser a -> FootnoteWriterT Parser a
forall (m :: * -> *) a. Monad m => m a -> FootnoteWriterT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift Parser a
p