content: {-# LANGUAGE Rank2Types #-}
  module Text.PariPari.Internal.Run (
    runParser
    , runParserWithOptions
  ) where
  
  import Text.PariPari.Internal.Acceptor
  import Text.PariPari.Internal.Class
  import Text.PariPari.Internal.Chunk
  import Text.PariPari.Internal.Reporter
  
  -- | Rsun fast 'Acceptor' and slower 'Reporter' on the given  sequentially.
  -- The 'FilePath' is used for error reporting.
  -- When the acceptor does not return successfully, the result from the reporter
  -- is awaited.
  runParser :: Chunk k => (forall p. Parser k p => p a) -> FilePath -> k -> (Maybe a, [Report])
  runParser = runParserWithOptions defaultReportOptions
  {-# INLINE runParser #-}
  
  -- | Run parsers **sequentially** with additional 'ReportOptions'.
  runParserWithOptions :: Chunk k => ReportOptions -> (forall p. Parser k p => p a) -> FilePath -> k -> (Maybe a, [Report])
  runParserWithOptions o p f b =
    let a = runAcceptor p f b
        r = runReporterWithOptions o p f b
    in case a of
         Nothing  -> r
         Just x -> (Just x, [])
  {-# INLINE runParserWithOptions #-}
  