content: -- |
  -- The core functional representation for binders
  --
  module Language.PureScript.CoreFn.Binders where
  
  import Prelude
  
  import Language.PureScript.AST.Literals (Literal)
  import Language.PureScript.Names (Ident, ProperName, ProperNameType(..), Qualified)
  
  -- |
  -- Data type for binders
  --
  data Binder a
    -- |
    -- Wildcard binder
    --
    = NullBinder a
    -- |
    -- A binder which matches a literal value
    --
    | LiteralBinder a (Literal (Binder a))
    -- |
    -- A binder which binds an identifier
    --
    | VarBinder a Ident
    -- |
    -- A binder which matches a data constructor
    --
    | ConstructorBinder a (Qualified (ProperName 'TypeName)) (Qualified (ProperName 'ConstructorName)) [Binder a]
    -- |
    -- A binder which binds its input to an identifier
    --
    | NamedBinder a Ident (Binder a) deriving (Eq, Ord, Show, Functor)
  
  
  extractBinderAnn :: Binder a -> a
  extractBinderAnn (NullBinder a) = a
  extractBinderAnn (LiteralBinder a _) = a
  extractBinderAnn (VarBinder a _) = a
  extractBinderAnn (ConstructorBinder a _ _ _) = a
  extractBinderAnn (NamedBinder a _ _) = a
  