g2-0.1.0.0: src/G2/Language/Ids.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
module G2.Language.Ids where
import G2.Language.Syntax
import G2.Language.AST
import qualified Data.Map as M
import qualified Data.HashSet as HS
class Ided a where
ids :: a -> [Id]
instance Ided Id where
{-# INLINE ids #-}
ids i@(Id _ t) = i:ids t
instance Ided Name where
{-# INLINE ids #-}
ids _ = []
instance Ided Expr where
ids = eval go
where
go :: Expr -> [Id]
go (Var i) = ids i
go (Prim _ t) = ids t
go (Data d) = ids d
go (Lam _ i _) = ids i
go (Let b _) = concatMap (ids . fst) b
go (Case _ i a) = ids i ++ concatMap (ids . altMatch) a
go (Type t) = ids t
go _ = []
instance Ided Type where
ids = eval go
where
go (TyVar i) = ids i
go (TyForAll b _) = ids b
go _ = []
instance Ided DataCon where
{-# INLINE ids #-}
ids (DataCon _ t) = ids t
instance Ided AltMatch where
{-# INLINE ids #-}
ids (DataAlt dc i) = ids dc ++ i
ids _ = []
instance Ided TyBinder where
{-# INLINE ids #-}
ids (AnonTyBndr t) = ids t
ids (NamedTyBndr i) = ids i
instance Ided Coercion where
{-# INLINE ids #-}
ids (t1 :~ t2) = ids t1 ++ ids t2
instance Ided a => Ided [a] where
{-# INLINE ids #-}
ids = foldMap ids
instance Ided a => Ided (Maybe a) where
{-# INLINE ids #-}
ids = foldMap ids
instance Ided a => Ided (M.Map k a) where
{-# INLINE ids #-}
ids = foldMap ids
instance Ided s => Ided (HS.HashSet s) where
{-# INLINE ids #-}
ids = foldMap ids
instance (Ided a, Ided b) => Ided (a, b) where
ids (a, b) = ids a ++ ids b
instance (Ided a, Ided b, Ided c) => Ided (a, b, c) where
ids (a, b, c) = ids a ++ ids b ++ ids c