> import System.IO > import System.Environment > main :: IO () > main = do > [a] <- getArgs > r <- readFile a > let ls = lines r > a = noAdjacentBlankLines ls > b = concat $ combineGroups $ group [] a > putStrLn $ unlines b > noAdjacentBlankLines [] = [] > noAdjacentBlankLines [a] = [a] > noAdjacentBlankLines ("":xs@("":_)) = noAdjacentBlankLines xs > noAdjacentBlankLines (x:xs) = x:noAdjacentBlankLines xs > group :: [String] -> [String] -> [[String]] > group acc [] = [acc] > group acc ("":xs) = reverse ("":acc) : group [] xs > group acc (x:xs) = group (x : acc) xs > combineGroups :: [[String]] -> [[String]] > combineGroups [] = [] > combineGroups (x@(('<':_):_):xs) | gs <- map trim x > , ns <- trim $ unwords gs > , length ns < 80 = [ns ++ "\n"] : combineGroups xs > combineGroups (x:xs) = x:combineGroups xs > trim :: String -> String > trim = x . x > where > x = dropWhile (==' ') . reverse