module Data.Array.Repa.Plugin.ToDDC.Detect.Base
( Detect (..)
, DetectS (..)
, zeroState
, collect
, setRateVar
, isRateVar)
where
import DDC.Core.Flow
import Data.Array.Repa.Plugin.FatName
import Data.Map (Map)
import Data.Set (Set)
import Control.Monad.State.Strict
import qualified Data.Map as Map
import qualified Data.Set as Set
class Detect (c :: * -> *) where
detect :: c FatName -> State DetectS (c Name)
data DetectS
= DetectS
{
stateNames :: Map Name GhcName
, stateRateVars :: Set Name }
zeroState :: DetectS
zeroState
= DetectS
{ stateNames = Map.empty
, stateRateVars = Set.empty }
collect :: Name -> GhcName -> State DetectS ()
collect !d !g
= modify $ \s -> s { stateNames = Map.insert d g (stateNames s) }
setRateVar :: Name -> State DetectS ()
setRateVar !name
= modify $ \s -> s { stateRateVars = Set.insert name (stateRateVars s) }
isRateVar :: Name -> State DetectS Bool
isRateVar name
= do s <- gets stateRateVars
return $ Set.member name s