moduleGeneral.GetOpt(OptDescr(..),ArgDescr(..),getOpt ,fmapOptDescr ,showOptDescr ,mergeOptDescr ,removeOverlap ,optionsEnum ,optionsEnumDesc )whereimportqualifiedSystem.Console.GetOptasOimportSystem.Console.GetOpthiding(getOpt)importqualifiedData.HashSetasSetimportData.MaybeimportData.EitherimportData.List.ExtragetOpt::[OptDescr(EitherStringa )]->[String]->([a ],[String],[String])getOpt opts args =(flagGood ,files ,flagBad ++errs )where(flags ,files ,errs )=O.getOptO.Permuteopts args (flagBad ,flagGood )=partitionEithersflags -- fmap is only an instance in later GHC 7.8 and above, so fake our own versionfmapOptDescr::(a ->b )->OptDescr(EitherStringa )->OptDescr(EitherStringb )fmapOptDescr f (Optiona b c d )=Optiona b (g c )d whereg (NoArga )=NoArg$fmapf a g(ReqArga b )=ReqArg(fmapf .a )b g(OptArga b )=OptArg(fmapf .a )b showOptDescr::[OptDescra ]->[String]showOptDescr xs =concat[ifnargs <=26then[" "++args ++replicate(28-nargs )' '++desc ]else[" "++args ,replicate30' '++desc ]|Options l arg desc <-xs ,letargs =intercalate", "$map(short arg )s ++map(long arg )l ,letnargs =lengthargs ]whereshort NoArg{}x ="-"++[x ]short(ReqArg_b )x ="-"++[x ]++" "++b short(OptArg_b )x ="-"++[x ]++"["++b ++"]"long NoArg{}x ="--"++x long(ReqArg_b )x ="--"++x ++"="++b long(OptArg_b )x ="--"++x ++"[="++b ++"]"-- | Remove flags from the first field that are present in the secondremoveOverlap::[OptDescrb ]->[OptDescra ]->[OptDescra ]removeOverlap bad =mapMaybef whereshort =Set.fromList$concat[x |Optionx ___<-bad ]long =Set.fromList$concat[x |Option_x __<-bad ]f (Optiona b c d )|nulla2 &&nullb2 =Nothing|otherwise=Just$Optiona2 b2 c d wherea2 =filter(not.flipSet.membershort )a b2 =filter(not.flipSet.memberlong )b mergeOptDescr::[OptDescr(EitherStringa )]->[OptDescr(EitherStringb )]->[OptDescr(EitherString(Eithera b ))]mergeOptDescr xs ys =map(fmapOptDescr Left)xs ++map(fmapOptDescr Right)ys optionsEnum::(Enuma ,Boundeda ,Showa )=>[OptDescr(EitherStringa )]optionsEnum =optionsEnumDesc [(x ,"Flag "++lower(showx )++".")|x <-[minBound..maxBound]]optionsEnumDesc::Showa =>[(a ,String)]->[OptDescr(EitherStringa )]optionsEnumDesc xs =[Option""[lower$showx ](NoArg$Rightx )d |(x ,d )<-xs ]