packages feed

compdata-0.8: benchmark/Functions/Comp/FreeVars.hs

{-# LANGUAGE
  TemplateHaskell,
  MultiParamTypeClasses,
  FlexibleInstances,
  FlexibleContexts,
  UndecidableInstances,
  TypeOperators,
  ScopedTypeVariables,
  TypeSynonymInstances,
  ConstraintKinds #-}

module Functions.Comp.FreeVars where

import DataTypes.Comp
import Data.Comp.Variables
import Data.Comp.Sum
import Data.Comp
import qualified Data.Foldable as F

-- we interpret integers as variables here


instance HasVars Value Int where
    isVar (VInt i) = Just i
    isVar _ = Nothing

instance HasVars Op Int where

instance HasVars Sugar Int where

contVar :: Int -> SugarExpr -> Bool
contVar = containsVar


freeVars :: SugarExpr -> [Int]
freeVars = variableList

contVar' :: Int -> SugarExpr -> Bool
contVar' i = cata alg
    where alg :: SugarSig Bool -> Bool
          alg x = case proj x of
                    Just (VInt j) -> i == j
                    _ -> F.foldl (||) False x

contVarGen :: Int -> SugarExpr -> Bool
contVarGen i e = elem i [ j | VInt j <- subterms' e]

freeVars' :: SugarExpr -> [Int]
freeVars' = cata alg
    where alg :: SugarSig [Int] -> [Int]
          alg x = case proj x of
                    Just (VInt j) -> [ j ]
                    _ -> F.foldl (++) [] x


freeVarsGen :: SugarExpr -> [Int]
freeVarsGen e =  [ j | VInt j <- subterms' e]