Language/Atom/Analysis.hs

module Language.Atom.Analysis
 ( topo
 , ruleComplexity
 ) where

import Language.Atom.Elaboration
import Language.Atom.Expressions

-- | Topologically sorts a list of expressions and subexpressions.
topo :: [UE] -> [(UE, String)]
topo ues = reverse ues'
 where
 start = 0
 (_, ues') = foldl collect (start, []) ues
 collect :: (Int, [(UE, String)]) -> UE -> (Int, [(UE, 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

e :: Int -> String
e i = "__" ++ show i

-- | Number of UE's computed in rule.
ruleComplexity :: Rule -> Int
ruleComplexity = length . topo . allUEs

AltStyle によって変換されたページ (->オリジナル) /