module Language.Atom.Analysis
( topo
, ruleComplexity
) where
import Language.Atom.Elaboration
import Language.Atom.UeMap
topo :: UeMap -> [Hash] -> [(Hash, String)]
topo mp ues = reverse ues'
where
start = 0
(_, ues') = foldl collect (start, []) ues
collect :: (Int, [(Hash, String)]) -> Hash -> (Int, [(Hash, String)])
collect (n, ues_) ue | any ((== ue) . fst) ues_ = (n, ues_)
collect (n, ues_) ue = (n' + 1, (ue, e n') : ues'')
where (n', ues'') = foldl collect (n, ues_) $ ueUpstream ue mp
e :: Int -> String
e i = "__" ++ show i
ruleComplexity :: UeMap -> Rule -> Int
ruleComplexity mp = length . (topo mp) . allUEs