{-# LANGUAGE FlexibleContexts #-}

module Language.Ltml.Parser.Keyword
    ( keywordP
    , lKeywordP
    , mlKeywordP
    )
where

import Control.Applicative (optional)
import Control.Monad (void)
import Language.Lsd.AST.Common (Keyword (Keyword))
import Language.Ltml.AST.Label (Label)
import Language.Ltml.Parser (MonadParser)
import Language.Ltml.Parser.Label (labelingP)
import Text.Megaparsec.Char (string)

keywordP :: (MonadParser m) => Keyword -> m ()
keywordP :: forall (m :: * -> *). MonadParser m => Keyword -> m ()
keywordP (Keyword Text
kw) = m (Tokens Text) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (Tokens Text) -> m ()) -> m (Tokens Text) -> m ()
forall a b. (a -> b) -> a -> b
$ Tokens Text -> m (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Text
Tokens Text
kw

lKeywordP :: (MonadParser m) => Keyword -> m Label
lKeywordP :: forall (m :: * -> *). MonadParser m => Keyword -> m Label
lKeywordP (Keyword Text
kw) = Tokens Text -> m (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Text
Tokens Text
kw m (Tokens Text) -> m Label -> m Label
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> m Label
forall (m :: * -> *). MonadParser m => m Label
labelingP

mlKeywordP :: (MonadParser m) => Keyword -> m (Maybe Label)
mlKeywordP :: forall (m :: * -> *). MonadParser m => Keyword -> m (Maybe Label)
mlKeywordP (Keyword Text
kw) = Tokens Text -> m (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Text
Tokens Text
kw m (Tokens Text) -> m (Maybe Label) -> m (Maybe Label)
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> m Label -> m (Maybe Label)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional m Label
forall (m :: * -> *). MonadParser m => m Label
labelingP