{-# OPTIONS_GHC -Wall #-}

module AST.Expression.Source where

import AST.PrettyPrint
import Text.PrettyPrint as P
import qualified AST.Expression.General as General
import AST.Type (RawType)
import qualified AST.Variable as Var
import qualified AST.Annotation as Annotation
import qualified AST.Pattern as Pattern


{-| Expressions created by the parser. These use a split representation of type
annotations and definitions, which is how they appear in source code and how
they are parsed.
-}
type Expr =
  General.Expr Annotation.Region Def Var.Raw


type Expr' =
  General.Expr' Annotation.Region Def Var.Raw


data Def
    = Definition Pattern.RawPattern Expr
    | TypeAnnotation String RawType
    deriving (Show)


instance Pretty Def where
  pretty def =
    case def of
      TypeAnnotation name tipe ->
          variable name <+> P.colon <+> pretty tipe

      Definition pattern expr ->
          pretty pattern <+> P.equals <+> pretty expr