module Misc where import qualified System.Console.GetOpt as GetOpt import System.Environment import System.Exit -- | exception on 'Left' unwrap :: Show a => FilePath -> Either a b -> IO b unwrap file = either (\x -> fail $ file <> ":" <> show x) return getOptionsWith :: (String -> String) -> ([String] -> Maybe a) -> [GetOpt.OptDescr (a -> a)] -> IO a getOptionsWith hdr mkDef descrs = do res <- GetOpt.getOpt GetOpt.Permute descrs <$> getArgs case res of (fs, rest, []) | Just def <- mkDef rest -> return $ foldl (flip ($)) def fs _ -> do prog <- getProgName putStrLn $ GetOpt.usageInfo (hdr prog) descrs exitFailure