-- | This provides a compatiblity wrapper to the @System.Console.GetOpt@ module in @base@.-- That module is essentially a Haskell port of the GNU @getopt@ library.---- /Changes:/ The changes from @GetOpt@ are listed in the documentation for each function.moduleSystem.Console.CmdArgs.GetOpt(convert,getOpt,getOpt',usageInfo,ArgOrder(..),OptDescr(..),ArgDescr(..))whereimportSystem.Console.CmdArgs.Explicit-- | What to do with options following non-options.---- /Changes:/ Only 'Permute' is allowed, both @RequireOrder@ and @ReturnInOrder@-- have been removed.dataArgOrdera=Permute-- | Each 'OptDescr' describes a single option/flag.---- The arguments to 'Option' are:---- * list of short option characters---- * list of long option strings (without "--", may not be 1 character long)---- * argument descriptor---- * explanation of option for userdatadataOptDescra=Option[Char][String](ArgDescra)String-- | Describes whether an option takes an argument or not, and if so-- how the argument is injected into a value of type @a@.dataArgDescra=NoArga-- ^ no argument expected|ReqArg(String->a)String-- ^ option requires argument|OptArg(MaybeString->a)String-- ^ optional argument-- | Return a string describing the usage of a command, derived from-- the header (first argument) and the options described by the -- second argument.usageInfo::String->[OptDescra]->StringusageInfodescflags=show$convertdescflags-- | Process the command-line, and return the list of values that matched-- (and those that didn\'t). The arguments are:---- * The order requirements (see 'ArgOrder')---- * The option descriptions (see 'OptDescr')---- * The actual command line arguments (presumably got from -- 'System.Environment.getArgs').---- 'getOpt' returns a triple consisting of the option arguments, a list-- of non-options, and a list of error messages.---- /Changes:/ The list of errors will contain at most one entry, and if an-- error is present then the other two lists will be empty.getOpt::ArgOrdera->[OptDescra]->[String]->([a],[String],[String])getOpt_flagsargs=caseprocess(convert""flags)argsofLeftx->([],[],[x])Right(a,b)->(a,b,[])-- | /Changes:/ This is exactly the same as 'getOpt', but the 3rd element of the-- tuple (second last) will be an empty list.getOpt'::ArgOrdera->[OptDescra]->[String]->([a],[String],[String],[String])getOpt'xyz=(a,b,[],c)where(a,b,c)=getOptxyz-- | Given a help text and a list of option descriptions, generate a 'Mode'.convert::String->[OptDescra]->Mode([a],[String])converthelpflags=mode"program"([],[])helpargs(mapfflags)whereargs=flagArg(\x(a,b)->Right(a,b++[x]))"ARG"f(Optionshortlongxhelp)=casexofNoArgx->flagNonenames(\(a,b)->(a++[x],b))helpReqArgopx->flagReqnames(\x(a,b)->Right(a++[opx],b))xhelpOptArgopx->flagOpt""names(\x(a,b)->Right(a++[op$ifnullxthenNothingelseJustx],b))xhelpwherenames=mapreturnshort++long