elm-syntax-0.3.0.0: src/Language/Elm/Definition.hs
module Language.Elm.Definition where
import Data.Void
import Bound (Scope)
import qualified Bound
import Language.Elm.Expression (Expression)
import qualified Language.Elm.Expression as Expression
import qualified Language.Elm.Name as Name
import Language.Elm.Type (Type)
import qualified Language.Elm.Type as Type
data Definition
= Constant !Name.Qualified !Int (Scope Int Type Void) (Expression Void)
| Type !Name.Qualified !Int [(Name.Constructor, [Scope Int Type Void])]
| Alias !Name.Qualified !Int (Scope Int Type Void)
deriving (Eq, Ord, Show)
name :: Definition -> Name.Qualified
name (Constant n _ _ _) = n
name (Type n _ _) = n
name (Alias n _ _) = n
foldMapGlobals
:: Monoid m
=> (Name.Qualified -> m)
-> Definition
-> m
foldMapGlobals f def =
case def of
Constant qname _ type_ expr ->
f qname <>
Type.foldMapGlobals f (Bound.fromScope type_) <>
Expression.foldMapGlobals f expr
Type qname _ constrs ->
f qname <>
foldMap (foldMap (foldMap (Type.foldMapGlobals f . Bound.fromScope))) constrs
Alias qname _ type_ ->
f qname <>
Type.foldMapGlobals f (Bound.fromScope type_)