content: -- | Interface to the Futhark parser.
  module Language.Futhark.Parser
    ( parseFuthark,
      parseFutharkWithComments,
      parseExp,
      parseModExp,
      parseType,
      parseDecOrExp,
      SyntaxError (..),
      Comment (..),
    )
  where
  
  import Data.Text qualified as T
  import Language.Futhark.Parser.Parser
  import Language.Futhark.Prop
  import Language.Futhark.Syntax
  
  -- | Parse an entire Futhark program from the given 'T.Text', using
  -- the 'FilePath' as the source name for error messages.
  parseFuthark ::
    FilePath ->
    T.Text ->
    Either SyntaxError UncheckedProg
  parseFuthark = parse prog
  
  -- | Parse an entire Futhark program from the given 'T.Text', using
  -- the 'FilePath' as the source name for error messages.  Also returns
  -- the comments encountered.
  parseFutharkWithComments ::
    FilePath ->
    T.Text ->
    Either SyntaxError (UncheckedProg, [Comment])
  parseFutharkWithComments = parseWithComments prog
  
  -- | Parse an Futhark expression from the given 'String', using the
  -- 'FilePath' as the source name for error messages.
  parseExp ::
    FilePath ->
    T.Text ->
    Either SyntaxError UncheckedExp
  parseExp = parse expression
  
  -- | Parse a Futhark module expression from the given 'String', using the
  -- 'FilePath' as the source name for error messages.
  parseModExp ::
    FilePath ->
    T.Text ->
    Either SyntaxError (ModExpBase NoInfo Name)
  parseModExp = parse modExpression
  
  -- | Parse an Futhark type from the given 'String', using the
  -- 'FilePath' as the source name for error messages.
  parseType ::
    FilePath ->
    T.Text ->
    Either SyntaxError UncheckedTypeExp
  parseType = parse futharkType
  
  -- | Parse either an expression or a declaration; favouring
  -- declarations in case of ambiguity.
  parseDecOrExp ::
    FilePath ->
    T.Text ->
    Either SyntaxError (Either UncheckedDec UncheckedExp)
  parseDecOrExp file input =
    case parse declaration file input of
      Left {} -> Right <$> parseExp file input
      Right d -> Right $ Left d
  