{-# language DeriveFoldable #-} {-# language DeriveFunctor #-} {-# language DeriveTraversable #-} {-# language OverloadedStrings #-} module Language.Elm.Pattern where import Data.Text (Text) import qualified Language.Elm.Name as Name data Pattern v = Var v | Wildcard | Con Name.Qualified [Pattern v] | List [Pattern v] | String !Text | Int !Integer | Float !Double deriving (Eq, Ord, Show, Functor, Foldable, Traversable) foldMapGlobals :: Monoid m => (Name.Qualified -> m) -> Pattern v -> m foldMapGlobals f pat = case pat of Var _ -> mempty Wildcard -> mempty Con c pats -> f c <> foldMap (foldMapGlobals f) pats List pats -> foldMap (foldMapGlobals f) pats String _ -> mempty Int _ -> mempty Float _ -> mempty tuple :: Pattern v -> Pattern v -> Pattern v tuple p1 p2 = Con "Basics.," [p1, p2]