packages feed

funcons-intgen-0.2.0.1: src/Types/Bindings.hs

module Types.Bindings where

import Types.SourceAbstractSyntax (MetaVar)

import qualified Types.CoreAbstractSyntax as C

import qualified Data.Set as S

class HasPatVar a where
  pvars :: a -> S.Set MetaVar

instance HasPatVar a => HasPatVar [a] where
  pvars c = S.unions $ fmap pvars c

instance (HasPatVar a, HasPatVar b) => HasPatVar (Either a b) where
  pvars (Left l) = pvars l
  pvars (Right r) = pvars r

instance (HasPatVar a) => HasPatVar (Maybe a) where
  pvars (Just j)  = pvars j
  pvars Nothing   = S.empty

instance HasPatVar C.FRewriteRule where
  pvars (C.FRewriteRule ps _ ss) = pvars ps `S.union` pvars ss

instance HasPatVar C.FPattern where
  pvars p = case p of 
    C.PMetaVar v -> S.singleton v
    C.PSeqVar v _ -> S.singleton v
    C.PAnnotated pat _ -> pvars pat
    C.PWildCard -> S.empty 
    C.PValue vpat -> pvars vpat

instance HasPatVar C.VPattern where
  pvars p = case p of 
    C.PADT _ ps -> S.unions $ fmap pvars ps
    C.VPWildCard -> S.empty
--    C.PList ps -> S.unions $ fmap pvars ps
    C.VPMetaVar var -> S.singleton var
    C.VPSeqVar var _ -> S.singleton var
    C.VPLit _ -> S.empty
    C.VPAnnotated pat _ -> pvars pat
    C.VPType tpat -> pvars tpat

instance HasPatVar C.TPattern where
  pvars p = case p of
    C.TPWildCard -> S.empty
    C.TPVar var -> S.singleton var
    C.TPSeqVar var _ -> S.singleton var
    C.TPLit _ -> S.empty
    C.TPComputes pat -> pvars pat
    C.TPComputesFrom f t -> pvars f `S.union` pvars t
    C.TPADT _ ps -> S.unions $ fmap pvars ps

instance HasPatVar C.FSideCondition where
  pvars sc = case sc of 
    C.SCPatternMatch _ p -> pvars p
    _ -> S.empty

instance HasPatVar C.FStepRule where
  pvars (C.FStepRule step scs) = pvars step `S.union` pvars scs

instance HasPatVar C.FStep where
  pvars step =  pvars (C.stepSource step) 
      `S.union` pvars (map snd $ C.stepInheritedEntities step)
      `S.union` pvars (map (\(_,x,_) -> x) $ C.stepMutableEntities step)
      `S.union` pvars (concatMap (\(_,x,_) -> x) $ C.stepInputEntities step)
      `S.union` S.fromList (concatMap (\(_,_,x) -> x) $ C.stepInputEntities step)
      `S.union` pvars (map snd $ C.stepControlEntities step)

instance HasPatVar C.FPremiseStep where
  pvars premise =  pvars (C.premiseTarget premise) 
      `S.union` pvars (map (\(_,_,x) -> x) $ C.premiseMutableEntities premise)
      `S.union` S.fromList (concatMap (\(_,_,x) -> maybe [] (:[]) x) $ C.premiseInputEntities premise)
      `S.union` pvars (map snd $ C.premiseOutputEntities premise)
      `S.union` pvars (map snd $ C.premiseControlEntities premise)