module Language.PureScript.AST.Binders where
import Language.PureScript.AST.SourcePos
import Language.PureScript.Names
import Language.PureScript.Comments
import Language.PureScript.Types
data Binder
= NullBinder
| BooleanBinder Bool
| StringBinder String
| CharBinder Char
| NumberBinder (Either Integer Double)
| VarBinder Ident
| ConstructorBinder (Qualified (ProperName 'ConstructorName)) [Binder]
| ObjectBinder [(String, Binder)]
| ArrayBinder [Binder]
| NamedBinder Ident Binder
| PositionedBinder SourceSpan [Comment] Binder
| TypedBinder Type Binder
deriving (Show, Read, Eq)
binderNames :: Binder -> [Ident]
binderNames = go []
where
go ns (VarBinder name) = name : ns
go ns (ConstructorBinder _ bs) = foldl go ns bs
go ns (ObjectBinder bs) = foldl go ns (map snd bs)
go ns (ArrayBinder bs) = foldl go ns bs
go ns (NamedBinder name b) = go (name : ns) b
go ns (PositionedBinder _ _ b) = go ns b
go ns (TypedBinder _ b) = go ns b
go ns _ = ns