{-# OPTIONS_GHC -fno-warn-orphans #-}
module System.Console.GetOpt.StandardOpts where

import Control.Applicative    ( (<$>) )
import Distribution.Text      ( display )
import Distribution.Version   ( Version )
import System.Console.GetOpt  ( ArgDescr (..), OptDescr (..), usageInfo )

data StandardFlag = HelpFlag | VersionFlag

standardOptions :: [OptDescr StandardFlag]
standardOptions = [ Option "h?" ["help"] (NoArg HelpFlag) "Show this help text"
                  , Option "v" ["version"] (NoArg VersionFlag) "Show the version number of this program"
                  ]

-- These instances should be moved to the main GetOpt module
instance Functor ArgDescr where
    fmap f (NoArg x) = NoArg $ f x
    fmap f (ReqArg p s) = ReqArg (f . p) s
    fmap f (OptArg p s) = OptArg (f . p) s

instance Functor OptDescr where
    fmap f (Option short long ad desc) = Option short long (f <$> ad) desc

stdOpts :: (StandardFlag -> a) -> [OptDescr a]
stdOpts f = (f <$>) <$> standardOptions

printHelp :: String -> [OptDescr a] -> IO ()
printHelp progName = putStrLn . usageInfo ("Usage:\n\t" ++ progName ++ " [FLAGS]\n")

printVersion :: String -> Version -> IO ()
printVersion name version = putStrLn $ name ++ ' ' : display version