packages feed

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 _ = []