packages feed

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