content: 
  module Utils where
  
  import Data.Function
  import Data.List
  import System.Exit
  import System.IO
  import Text.Regex.PCRE
  
  die :: Errors -> IO a
  die errs = do mapM_ (hPutStrLn stderr) errs
                exitFailure
  
  warn :: Errors -> IO ()
  warn warnings = mapM_ (hPutStrLn stderr) warnings
  
  dieOnErrors :: Either Errors a -> IO a
  dieOnErrors (Left errs) = die errs
  dieOnErrors (Right x) = return x
  
  type Errors = [String]
  type Warnings = [String]
  
  maybeRead :: Read a => String -> Maybe a
  maybeRead str = case reads str of
                  [(x, "")] -> Just x
                  _ -> Nothing
  
  re :: String -> String -> Maybe [String]
  re r str = case matchM r' str :: Maybe (String, String, String, [String]) of
             Just (_, _, _, ms) -> Just ms
             Nothing -> Nothing
      where r' = makeRegex r :: Regex
  
  unSepList :: Eq a => a -> [a] -> [[a]]
  unSepList x xs = case break (x ==) xs of
                   (this, _ : xs') ->
                       this : unSepList x xs'
                   (this, []) ->
                       [this]
  
  sortByFst :: Ord a => [(a, b)] -> [(a, b)]
  sortByFst = sortBy (compare `on` fst)
  
  