[GenUtil updates
John Meacham <john@repetae.net>**20060320113756] hunk ./GenUtil.hs 2
---  $Id: GenUtil.hs,v 1.48 2006/01/29 05:22:26 john Exp $
+--  $Id: GenUtil.hs,v 1.49 2006/03/20 11:37:16 john Exp $
hunk ./GenUtil.hs 107
+    rspan,
+    rdropWhile,
+    rtakeWhile,
+    rbdropWhile,
hunk ./GenUtil.hs 157
+concatMapM :: Monad m => (a -> m [b]) -> [a] -> m [b]
+concatMapM f xs = do
+    res <- mapM f xs
+    return $ concat res
+
+rspan :: (a -> Bool) -> [a] -> ([a], [a])
+rspan fn xs = f xs [] where
+    f [] rs = ([],reverse rs)
+    f (x:xs) rs
+        | fn x = f xs (x:rs)
+        | otherwise = (reverse rs ++ za,zb) where
+            (za,zb) = f xs []
+
+rbreak :: (a -> Bool) -> [a] -> ([a], [a])
+rbreak fn xs = rspan (not . fn) xs
+
+rdropWhile :: (a -> Bool) -> [a] -> [a]
+rdropWhile fn xs = f xs [] where
+    f [] _ = []
+    f (x:xs) rs
+        | fn x = f xs (x:rs)
+        | otherwise = reverse rs ++ (f xs [])
+
+rtakeWhile :: (a -> Bool) -> [a] -> [a]
+rtakeWhile fn xs = f xs [] where
+    f [] rs = reverse rs
+    f (x:xs) rs
+        | fn x = f xs (x:rs)
+        | otherwise = f xs []
+
+rbdropWhile :: (a -> Bool) -> [a] -> [a]
+rbdropWhile fn xs = rdropWhile fn (dropWhile fn xs)
+
hunk ./GenUtil.hs 566
-trimBlankLines cs = unlines $ reverse (tb $ reverse (tb (lines cs))) where
-    tb = dropWhile (all isSpace)
+trimBlankLines cs = unlines $ rbdropWhile (all isSpace) (lines cs)