setdown-0.1.0.0: SimpleDefinitionCycles.hs
module SimpleDefinitionCycles
( getCyclesInSimpleDefinitions
) where
import SetData
import qualified Data.Graph as G
getCyclesInSimpleDefinitions :: SimpleDefinitions -> [SimpleDefinitions]
getCyclesInSimpleDefinitions = filter (not . null) . fmap getCycles . simpleDefinitionsToSCC
getCycles :: G.SCC SimpleDefinition -> SimpleDefinitions
getCycles (G.CyclicSCC verticies) = verticies
getCycles _ = []
simpleDefinitionsToSCC :: SimpleDefinitions -> [G.SCC SimpleDefinition]
simpleDefinitionsToSCC = G.stronglyConnComp . fmap toNode
toNode :: SimpleDefinition -> (SimpleDefinition, Identifier, [Identifier])
toNode sd = (sd, sdId sd, getIdsFromSimpleDefinition sd)
getIdsFromSimpleDefinition :: SimpleDefinition -> [Identifier]
getIdsFromSimpleDefinition (SimpleDefinition _ expr _) = getIdsFromSimpleExpression expr
getIdsFromSimpleExpression :: SimpleExpression -> [Identifier]
getIdsFromSimpleExpression (SimpleBinaryExpression _ left right) = getIdsFromBaseExpression left ++ getIdsFromBaseExpression right
getIdsFromSimpleExpression (SimpleUnaryExpression expr) = getIdsFromBaseExpression expr
getIdsFromBaseExpression :: BaseExpression -> [Identifier]
getIdsFromBaseExpression (BaseIdentifierExpression ident) = [ident]
getIdsFromBaseExpression _ = []