{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}

module Control.Monad.Parser
  ( module Control.Monad.Parser.Class,
    ParserT (..),
    ParseResult (..),
    ParseError (..),
    ErrorDesc (..),
    Parser,
    StringParser,
    ParserOf,
    CharParser,
    runParser,
    runStringParser,
    runTextParser,
  )
where

import Control.Monad.Identity
import Control.Monad.Parser.Class
import Control.Monad.Trans.Parser
import Data.Stream (Stream (Item))
import Data.Stream.StringLines (StringLines)
import qualified Data.Stream.StringLines as SL
import Data.Stream.TextLines
import qualified Data.Stream.TextLines as TL
import Data.Text (Text)

type ParserOf i p = (MonadParser p, Item (Input p) ~ i)

type CharParser p = ParserOf Char p

type Parser s a = ParserT s Identity a

runParser :: Parser s a -> s -> ParseResult a s
runParser :: Parser s a -> s -> ParseResult a s
runParser Parser s a
p = Identity (ParseResult a s) -> ParseResult a s
forall a. Identity a -> a
runIdentity (Identity (ParseResult a s) -> ParseResult a s)
-> (s -> Identity (ParseResult a s)) -> s -> ParseResult a s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser s a -> s -> Identity (ParseResult a s)
forall s (m :: * -> *) a. ParserT s m a -> s -> m (ParseResult a s)
runParserT Parser s a
p

type StringParser a = Parser StringLines a

runStringParser :: StringParser a -> String -> ParseResult a StringLines
runStringParser :: StringParser a -> String -> ParseResult a StringLines
runStringParser StringParser a
p String
s = Identity (ParseResult a StringLines) -> ParseResult a StringLines
forall a. Identity a -> a
runIdentity (Identity (ParseResult a StringLines) -> ParseResult a StringLines)
-> Identity (ParseResult a StringLines)
-> ParseResult a StringLines
forall a b. (a -> b) -> a -> b
$ StringParser a
-> StringLines -> Identity (ParseResult a StringLines)
forall s (m :: * -> *) a. ParserT s m a -> s -> m (ParseResult a s)
runParserT StringParser a
p (StringLines -> Identity (ParseResult a StringLines))
-> StringLines -> Identity (ParseResult a StringLines)
forall a b. (a -> b) -> a -> b
$ String -> StringLines
SL.fromString String
s

type TextParser a = Parser TextLines a

runTextParser :: TextParser a -> Text -> ParseResult a TextLines
runTextParser :: TextParser a -> Text -> ParseResult a TextLines
runTextParser TextParser a
p Text
s = Identity (ParseResult a TextLines) -> ParseResult a TextLines
forall a. Identity a -> a
runIdentity (Identity (ParseResult a TextLines) -> ParseResult a TextLines)
-> Identity (ParseResult a TextLines) -> ParseResult a TextLines
forall a b. (a -> b) -> a -> b
$ TextParser a -> TextLines -> Identity (ParseResult a TextLines)
forall s (m :: * -> *) a. ParserT s m a -> s -> m (ParseResult a s)
runParserT TextParser a
p (TextLines -> Identity (ParseResult a TextLines))
-> TextLines -> Identity (ParseResult a TextLines)
forall a b. (a -> b) -> a -> b
$ Text -> TextLines
TL.fromText Text
s