This is an extract of a larger literate Haskell file for testing SLOCCount. It should have 21 lines of code. This dumps the tree in dot format, which is very handy for visualizing the trees. > dotTree name t = "digraph " ++ filter dotChars name ++ " { " ++ (dotTree' t 0) ++ " }" > dotTree' Empty _ = "" > dotTree' t i | is_leaf t = "n"++(show i)++" [label=\""++(show $ x_span t)++ > "\",shape=box]; " > | otherwise = "n"++(show i)++" [label=\""++(show $ x_span t)++"\"]; " ++ > "n"++(show i)++" -> n"++(show (2*i+1))++"; "++ > "n"++(show i)++" -> n"++(show (2*i+2))++"; "++ > dotTree' (left t) (2*i+1) ++ > dotTree' (right t) (2*i+2) > where is_leaf Node { left = Empty, right = Empty } = True > is_leaf _ = False > {- this is a comment foo bar baz > that > spans literate blocks -} > dotChars '.' = False > dotChars '/' = False > dotChars _ = True These functions fill in the monotonically increasing index values for the lines in the finite map. They also do appropriate things to combine the world values. > idxList [] n = [] > idxList (x:xs) n = (x {idx=n}):(idxList xs (n+1)) > idxFM' fm (x,k) = addToFM (delFromFM fm k) k (y {idx=toInteger x}) > where y = case lookupFM fm k of > Just foo -> foo > Nothing -> error $ "No such key: " ++ show k > idxFM fm = foldl idxFM' fm (zip [1..sizeFM fm] $ keysFM fm)