-- |
-- The core functional representation for binders
--
module Language.PureScript.CoreFn.Binders where

import Prelude

import Language.PureScript.AST.Literals
import Language.PureScript.Names

-- |
-- 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 (Binder a -> Binder a -> Bool
forall a. Eq a => Binder a -> Binder a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Binder a -> Binder a -> Bool
$c/= :: forall a. Eq a => Binder a -> Binder a -> Bool
== :: Binder a -> Binder a -> Bool
$c== :: forall a. Eq a => Binder a -> Binder a -> Bool
Eq, Binder a -> Binder a -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (Binder a)
forall a. Ord a => Binder a -> Binder a -> Bool
forall a. Ord a => Binder a -> Binder a -> Ordering
forall a. Ord a => Binder a -> Binder a -> Binder a
min :: Binder a -> Binder a -> Binder a
$cmin :: forall a. Ord a => Binder a -> Binder a -> Binder a
max :: Binder a -> Binder a -> Binder a
$cmax :: forall a. Ord a => Binder a -> Binder a -> Binder a
>= :: Binder a -> Binder a -> Bool
$c>= :: forall a. Ord a => Binder a -> Binder a -> Bool
> :: Binder a -> Binder a -> Bool
$c> :: forall a. Ord a => Binder a -> Binder a -> Bool
<= :: Binder a -> Binder a -> Bool
$c<= :: forall a. Ord a => Binder a -> Binder a -> Bool
< :: Binder a -> Binder a -> Bool
$c< :: forall a. Ord a => Binder a -> Binder a -> Bool
compare :: Binder a -> Binder a -> Ordering
$ccompare :: forall a. Ord a => Binder a -> Binder a -> Ordering
Ord, Int -> Binder a -> ShowS
forall a. Show a => Int -> Binder a -> ShowS
forall a. Show a => [Binder a] -> ShowS
forall a. Show a => Binder a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Binder a] -> ShowS
$cshowList :: forall a. Show a => [Binder a] -> ShowS
show :: Binder a -> String
$cshow :: forall a. Show a => Binder a -> String
showsPrec :: Int -> Binder a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Binder a -> ShowS
Show, forall a b. a -> Binder b -> Binder a
forall a b. (a -> b) -> Binder a -> Binder b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Binder b -> Binder a
$c<$ :: forall a b. a -> Binder b -> Binder a
fmap :: forall a b. (a -> b) -> Binder a -> Binder b
$cfmap :: forall a b. (a -> b) -> Binder a -> Binder b
Functor)


extractBinderAnn :: Binder a -> a
extractBinderAnn :: forall a. Binder a -> a
extractBinderAnn (NullBinder a
a) = a
a
extractBinderAnn (LiteralBinder a
a Literal (Binder a)
_) = a
a
extractBinderAnn (VarBinder a
a Ident
_) = a
a
extractBinderAnn (ConstructorBinder a
a Qualified (ProperName 'TypeName)
_ Qualified (ProperName 'ConstructorName)
_ [Binder a]
_) = a
a
extractBinderAnn (NamedBinder a
a Ident
_ Binder a
_) = a
a