{-# LANGUAGE TupleSections #-}

-- | Command line parsing flags.
module Development.Shake.Internal.Args(
    shakeOptDescrs,
    shakeArgs, shakeArgsWith, shakeArgsOptionsWith
    ) where

import Development.Shake.Internal.Paths
import Development.Shake.Internal.Options
import Development.Shake.Internal.Core.Rules
import Development.Shake.Internal.Demo
import Development.Shake.FilePath
import Development.Shake.Internal.Rules.File
import Development.Shake.Internal.Progress
import Development.Shake.Internal.Shake
import General.Timing
import General.GetOpt

import Data.Tuple.Extra
import Control.Concurrent
import Control.Exception.Extra
import Control.Monad
import Data.Char
import Data.Either
import Data.Functor
import Data.List
import Data.Maybe
import System.Directory.Extra
import System.Environment
import System.Exit
import System.Time.Extra
import Prelude


-- | Run a build system using command line arguments for configuration.
--   The available flags are those from 'shakeOptDescrs', along with a few additional
--   @make@ compatible flags that are not represented in 'ShakeOptions', such as @--print-directory@.
--   If there are no file arguments then the 'Rules' are used directly, otherwise the file arguments
--   are 'want'ed (after calling 'withoutActions'). As an example:
--
-- @
-- main = 'shakeArgs' 'shakeOptions'{'shakeFiles' = \"_make\", 'shakeProgress' = 'progressSimple'} $ do
--     'phony' \"clean\" $ 'Development.Shake.removeFilesAfter' \"_make\" [\"\/\/*\"]
--     'want' [\"_make\/neil.txt\",\"_make\/emily.txt\"]
--     \"_make\/*.txt\" '%>' \\out ->
--         ... build action here ...
-- @
--
--   This build system will default to building @neil.txt@ and @emily.txt@, while showing progress messages,
--   and putting the Shake files in locations such as @_make\/.database@. Some example command line flags:
--
-- * @main --no-progress@ will turn off progress messages.
--
-- * @main -j6@ will build on 6 threads.
--
-- * @main --help@ will display a list of supported flags.
--
-- * @main clean@ will not build anything, but will remove the @_make@ directory, including the
--   any 'shakeFiles'.
--
-- * @main _make/henry.txt@ will not build @neil.txt@ or @emily.txt@, but will instead build @henry.txt@.
shakeArgs :: ShakeOptions -> Rules () -> IO ()
shakeArgs :: ShakeOptions -> Rules () -> IO ()
shakeArgs opts :: ShakeOptions
opts rules :: Rules ()
rules = ShakeOptions
-> [OptDescr (Either String Any)]
-> ([Any] -> [String] -> IO (Maybe (Rules ())))
-> IO ()
forall a.
ShakeOptions
-> [OptDescr (Either String a)]
-> ([a] -> [String] -> IO (Maybe (Rules ())))
-> IO ()
shakeArgsWith ShakeOptions
opts [] [Any] -> [String] -> IO (Maybe (Rules ()))
forall (m :: * -> *) p.
Monad m =>
p -> [String] -> m (Maybe (Rules ()))
f
    where f :: p -> [String] -> m (Maybe (Rules ()))
f _ files :: [String]
files = Maybe (Rules ()) -> m (Maybe (Rules ()))
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (Rules ()) -> m (Maybe (Rules ())))
-> Maybe (Rules ()) -> m (Maybe (Rules ()))
forall a b. (a -> b) -> a -> b
$ Rules () -> Maybe (Rules ())
forall a. a -> Maybe a
Just (Rules () -> Maybe (Rules ())) -> Rules () -> Maybe (Rules ())
forall a b. (a -> b) -> a -> b
$ if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
files then Rules ()
rules else [String] -> Rules ()
want [String]
files Rules () -> Rules () -> Rules ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Rules () -> Rules ()
withoutActions Rules ()
rules


-- | A version of 'shakeArgs' with more flexible handling of command line arguments.
--   The caller of 'shakeArgsWith' can add additional flags (the second argument) and chose how to convert
--   the flags/arguments into rules (the third argument). Given:
--
-- @
-- 'shakeArgsWith' opts flags (\\flagValues argValues -> result)
-- @
--
-- * @opts@ is the initial 'ShakeOptions' value, which may have some fields overriden by command line flags.
--   This argument is usually 'shakeOptions', perhaps with a few fields overriden.
--
-- * @flags@ is a list of flag descriptions, which either produce a 'String' containing an error
--   message (typically for flags with invalid arguments, .e.g. @'Left' \"could not parse as int\"@), or a value
--   that is passed as @flagValues@. If you have no custom flags, pass @[]@.
--
-- * @flagValues@ is a list of custom flags that the user supplied. If @flags == []@ then this list will
--   be @[]@.
--
-- * @argValues@ is a list of non-flag arguments, which are often treated as files and passed to 'want'.
--
-- * @result@ should produce a 'Nothing' to indicate that no building needs to take place, or a 'Just'
--   providing the rules that should be used.
--
--   As an example of a build system that can use either @gcc@ or @distcc@ for compiling:
--
-- @
-- import System.Console.GetOpt
--
-- data Flags = DistCC deriving Eq
-- flags = [Option \"\" [\"distcc\"] (NoArg $ Right DistCC) \"Run distributed.\"]
--
-- main = 'shakeArgsWith' 'shakeOptions' flags $ \\flags targets -> return $ Just $ do
--     if null targets then 'want' [\"result.exe\"] else 'want' targets
--     let compiler = if DistCC \`elem\` flags then \"distcc\" else \"gcc\"
--     \"*.o\" '%>' \\out -> do
--         'need' ...
--         'cmd' compiler ...
--     ...
-- @
--
--   Now you can pass @--distcc@ to use the @distcc@ compiler.
shakeArgsWith :: ShakeOptions -> [OptDescr (Either String a)] -> ([a] -> [String] -> IO (Maybe (Rules ()))) -> IO ()
shakeArgsWith :: ShakeOptions
-> [OptDescr (Either String a)]
-> ([a] -> [String] -> IO (Maybe (Rules ())))
-> IO ()
shakeArgsWith opt :: ShakeOptions
opt args :: [OptDescr (Either String a)]
args f :: [a] -> [String] -> IO (Maybe (Rules ()))
f = ShakeOptions
-> [OptDescr (Either String a)]
-> (ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
-> IO ()
forall a.
ShakeOptions
-> [OptDescr (Either String a)]
-> (ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
-> IO ()
shakeArgsOptionsWith ShakeOptions
opt [OptDescr (Either String a)]
args ((ShakeOptions
  -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
 -> IO ())
-> (ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
-> IO ()
forall a b. (a -> b) -> a -> b
$ \so :: ShakeOptions
so a :: [a]
a b :: [String]
b -> (Rules () -> (ShakeOptions, Rules ()))
-> Maybe (Rules ()) -> Maybe (ShakeOptions, Rules ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ShakeOptions
so,) (Maybe (Rules ()) -> Maybe (ShakeOptions, Rules ()))
-> IO (Maybe (Rules ())) -> IO (Maybe (ShakeOptions, Rules ()))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a] -> [String] -> IO (Maybe (Rules ()))
f [a]
a [String]
b

-- | Like 'shakeArgsWith', but also lets you manipulate the 'ShakeOptions'.
shakeArgsOptionsWith
    :: ShakeOptions
    -> [OptDescr (Either String a)]
    -> (ShakeOptions -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
    -> IO ()
shakeArgsOptionsWith :: ShakeOptions
-> [OptDescr (Either String a)]
-> (ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
-> IO ()
shakeArgsOptionsWith baseOpts :: ShakeOptions
baseOpts userOptions :: [OptDescr (Either String a)]
userOptions rules :: ShakeOptions
-> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ()))
rules = do
    String -> IO ()
addTiming "shakeArgsWith"
    [String]
args <- IO [String]
getArgs
    let (flag1 :: [Either ([Extra], ShakeOptions -> ShakeOptions) a]
flag1,files :: [String]
files,errs :: [String]
errs) = [OptDescr
   (Either String (Either ([Extra], ShakeOptions -> ShakeOptions) a))]
-> [String]
-> ([Either ([Extra], ShakeOptions -> ShakeOptions) a], [String],
    [String])
forall a.
[OptDescr (Either String a)]
-> [String] -> ([a], [String], [String])
getOpt [OptDescr
   (Either String (Either ([Extra], ShakeOptions -> ShakeOptions) a))]
opts [String]
args
        (self :: [([Extra], ShakeOptions -> ShakeOptions)]
self,user :: [a]
user) = [Either ([Extra], ShakeOptions -> ShakeOptions) a]
-> ([([Extra], ShakeOptions -> ShakeOptions)], [a])
forall a b. [Either a b] -> ([a], [b])
partitionEithers [Either ([Extra], ShakeOptions -> ShakeOptions) a]
flag1
        (flagsExtra :: [Extra]
flagsExtra,flagsShake :: [ShakeOptions -> ShakeOptions]
flagsShake) = ([[Extra]] -> [Extra])
-> ([[Extra]], [ShakeOptions -> ShakeOptions])
-> ([Extra], [ShakeOptions -> ShakeOptions])
forall a a' b. (a -> a') -> (a, b) -> (a', b)
first [[Extra]] -> [Extra]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (([[Extra]], [ShakeOptions -> ShakeOptions])
 -> ([Extra], [ShakeOptions -> ShakeOptions]))
-> ([[Extra]], [ShakeOptions -> ShakeOptions])
-> ([Extra], [ShakeOptions -> ShakeOptions])
forall a b. (a -> b) -> a -> b
$ [([Extra], ShakeOptions -> ShakeOptions)]
-> ([[Extra]], [ShakeOptions -> ShakeOptions])
forall a b. [(a, b)] -> ([a], [b])
unzip [([Extra], ShakeOptions -> ShakeOptions)]
self
        progressReplays :: [String]
progressReplays = [String
x | ProgressReplay x :: String
x <- [Extra]
flagsExtra]
        progressRecords :: [String]
progressRecords = [String
x | ProgressRecord x :: String
x <- [Extra]
flagsExtra]
        changeDirectory :: Maybe String
changeDirectory = [String] -> Maybe String
forall a. [a] -> Maybe a
listToMaybe [String
x | ChangeDirectory x :: String
x <- [Extra]
flagsExtra]
        printDirectory :: Bool
printDirectory = [Bool] -> Bool
forall a. [a] -> a
last ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ Bool
False Bool -> [Bool] -> [Bool]
forall a. a -> [a] -> [a]
: [Bool
x | PrintDirectory x :: Bool
x <- [Extra]
flagsExtra]
        oshakeOpts :: ShakeOptions
oshakeOpts = (ShakeOptions -> (ShakeOptions -> ShakeOptions) -> ShakeOptions)
-> ShakeOptions -> [ShakeOptions -> ShakeOptions] -> ShakeOptions
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (((ShakeOptions -> ShakeOptions) -> ShakeOptions -> ShakeOptions)
-> ShakeOptions -> (ShakeOptions -> ShakeOptions) -> ShakeOptions
forall a b c. (a -> b -> c) -> b -> a -> c
flip (ShakeOptions -> ShakeOptions) -> ShakeOptions -> ShakeOptions
forall a b. (a -> b) -> a -> b
($)) ShakeOptions
baseOpts [ShakeOptions -> ShakeOptions]
flagsShake
        shakeOpts :: ShakeOptions
shakeOpts = ShakeOptions
oshakeOpts {shakeLintInside :: [String]
shakeLintInside = (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String -> String
toStandard (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
normalise (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
addTrailingPathSeparator) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$
                                                  ShakeOptions -> [String]
shakeLintInside ShakeOptions
oshakeOpts
                               ,shakeLintIgnore :: [String]
shakeLintIgnore = (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
toStandard ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$
                                                  ShakeOptions -> [String]
shakeLintIgnore ShakeOptions
oshakeOpts
                               ,shakeOutput :: Verbosity -> String -> IO ()
shakeOutput     = if ShakeOptions -> Bool
shakeColor ShakeOptions
oshakeOpts
                                                  then (Verbosity -> String -> IO ()) -> Verbosity -> String -> IO ()
outputColor (ShakeOptions -> Verbosity -> String -> IO ()
shakeOutput ShakeOptions
oshakeOpts)
                                                  else ShakeOptions -> Verbosity -> String -> IO ()
shakeOutput ShakeOptions
oshakeOpts
                               }
    let putWhen :: Verbosity -> String -> IO ()
putWhen v :: Verbosity
v msg :: String
msg = Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ShakeOptions -> Verbosity
shakeVerbosity ShakeOptions
oshakeOpts Verbosity -> Verbosity -> Bool
forall a. Ord a => a -> a -> Bool
>= Verbosity
v) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> Verbosity -> String -> IO ()
shakeOutput ShakeOptions
oshakeOpts Verbosity
v String
msg
    let putWhenLn :: Verbosity -> String -> IO ()
putWhenLn v :: Verbosity
v msg :: String
msg = Verbosity -> String -> IO ()
putWhen Verbosity
v (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
msg String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\n"
    let showHelp :: IO ()
showHelp = do
            String
progName <- IO String
getProgName
            Verbosity -> String -> IO ()
putWhen Verbosity
Quiet (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unlines ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ ("Usage: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
progName String -> String -> String
forall a. [a] -> [a] -> [a]
++ " [options] [target] ...") String -> [String] -> [String]
forall a. a -> [a] -> [a]
: "Options:" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [OptDescr
   (Either String (Either ([Extra], ShakeOptions -> ShakeOptions) a))]
-> [String]
forall a. [OptDescr a] -> [String]
showOptDescr [OptDescr
   (Either String (Either ([Extra], ShakeOptions -> ShakeOptions) a))]
opts

    Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ([String]
errs [String] -> [String] -> Bool
forall a. Eq a => a -> a -> Bool
/= []) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
        Verbosity -> String -> IO ()
putWhen Verbosity
Quiet (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unlines ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ("shake: " String -> String -> String
forall a. [a] -> [a] -> [a]
++) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ String -> [String]
lines (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ [String] -> String
unlines [String]
errs
        IO ()
showHelp
        IO ()
forall a. IO a
exitFailure

    if Extra
Help Extra -> [Extra] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then
        IO ()
showHelp
     else if Extra
Version Extra -> [Extra] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then
        Verbosity -> String -> IO ()
putWhenLn Verbosity
Normal (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ "Shake build system, version " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
shakeVersionString
     else if Extra
NumericVersion Extra -> [Extra] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then
        Verbosity -> String -> IO ()
putWhenLn Verbosity
Normal String
shakeVersionString
     else if Extra
Demo Extra -> [Extra] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then
        Bool -> IO ()
demo (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> Bool
shakeStaunch ShakeOptions
shakeOpts
     else if Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
progressReplays then do
        [(String, [(Double, Progress)])]
dat <- [String]
-> (String -> IO (String, [(Double, Progress)]))
-> IO [(String, [(Double, Progress)])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [String]
progressReplays ((String -> IO (String, [(Double, Progress)]))
 -> IO [(String, [(Double, Progress)])])
-> (String -> IO (String, [(Double, Progress)]))
-> IO [(String, [(Double, Progress)])]
forall a b. (a -> b) -> a -> b
$ \file :: String
file -> do
            String
src <- String -> IO String
readFile String
file
            (String, [(Double, Progress)]) -> IO (String, [(Double, Progress)])
forall (m :: * -> *) a. Monad m => a -> m a
return (String
file, (String -> (Double, Progress)) -> [String] -> [(Double, Progress)]
forall a b. (a -> b) -> [a] -> [b]
map String -> (Double, Progress)
forall a. Read a => String -> a
read ([String] -> [(Double, Progress)])
-> [String] -> [(Double, Progress)]
forall a b. (a -> b) -> a -> b
$ String -> [String]
lines String
src)
        [String] -> (String -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([String] -> Bool) -> [String] -> Bool
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> [String]
shakeReport ShakeOptions
shakeOpts then ["-"] else ShakeOptions -> [String]
shakeReport ShakeOptions
shakeOpts) ((String -> IO ()) -> IO ()) -> (String -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \file :: String
file -> do
            Verbosity -> String -> IO ()
putWhenLn Verbosity
Normal (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ "Writing report to " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
file
            String -> [(String, [(Double, Progress)])] -> IO ()
writeProgressReport String
file [(String, [(Double, Progress)])]
dat
     else do
        Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Extra
Sleep Extra -> [Extra] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> IO ()
threadDelay 1000000
        IO Double
start <- IO (IO Double)
offsetTime
        IO ()
initDataDirectory -- must be done before we start changing directory
        let redir :: IO a -> IO a
redir = (IO a -> IO a)
-> (String -> IO a -> IO a) -> Maybe String -> IO a -> IO a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe IO a -> IO a
forall a. a -> a
id String -> IO a -> IO a
forall a. String -> IO a -> IO a
withCurrentDirectory Maybe String
changeDirectory
        ShakeOptions
shakeOpts <- if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
progressRecords then ShakeOptions -> IO ShakeOptions
forall (m :: * -> *) a. Monad m => a -> m a
return ShakeOptions
shakeOpts else do
            IO Double
t <- IO (IO Double)
offsetTime
            ShakeOptions -> IO ShakeOptions
forall (m :: * -> *) a. Monad m => a -> m a
return ShakeOptions
shakeOpts{shakeProgress :: IO Progress -> IO ()
shakeProgress = \p :: IO Progress
p ->
                IO ThreadId -> (ThreadId -> IO ()) -> (ThreadId -> IO ()) -> IO ()
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket
                    (IO () -> IO ThreadId
forkIO (IO () -> IO ThreadId) -> IO () -> IO ThreadId
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> IO Progress -> IO ()
shakeProgress ShakeOptions
shakeOpts IO Progress
p)
                    ThreadId -> IO ()
killThread
                    ((ThreadId -> IO ()) -> IO ()) -> (ThreadId -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ IO () -> ThreadId -> IO ()
forall a b. a -> b -> a
const (IO () -> ThreadId -> IO ()) -> IO () -> ThreadId -> IO ()
forall a b. (a -> b) -> a -> b
$ Double -> (String -> IO ()) -> IO Progress -> IO ()
progressDisplay 1 (IO () -> String -> IO ()
forall a b. a -> b -> a
const (IO () -> String -> IO ()) -> IO () -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()) (IO Progress -> IO ()) -> IO Progress -> IO ()
forall a b. (a -> b) -> a -> b
$ do
                        Progress
p <- IO Progress
p
                        Double
t <- IO Double
t
                        [String] -> (String -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [String]
progressRecords ((String -> IO ()) -> IO ()) -> (String -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \file :: String
file ->
                            String -> String -> IO ()
appendFile String
file (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ (Double, Progress) -> String
forall a. Show a => a -> String
show (Double
t,Progress
p) String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\n"
                        Progress -> IO Progress
forall (m :: * -> *) a. Monad m => a -> m a
return Progress
p
            }
        (ran :: Bool
ran,shakeOpts :: ShakeOptions
shakeOpts,res :: Either SomeException ()
res) <- IO (Bool, ShakeOptions, Either SomeException ())
-> IO (Bool, ShakeOptions, Either SomeException ())
forall a. IO a -> IO a
redir (IO (Bool, ShakeOptions, Either SomeException ())
 -> IO (Bool, ShakeOptions, Either SomeException ()))
-> IO (Bool, ShakeOptions, Either SomeException ())
-> IO (Bool, ShakeOptions, Either SomeException ())
forall a b. (a -> b) -> a -> b
$ do
            Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
printDirectory (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
                String
curdir <- IO String
getCurrentDirectory
                Verbosity -> String -> IO ()
putWhenLn Verbosity
Normal (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ "shake: In directory `" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
curdir String -> String -> String
forall a. [a] -> [a] -> [a]
++ "'"
            Maybe (ShakeOptions, Rules ())
rules <- ShakeOptions
-> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ()))
rules ShakeOptions
shakeOpts [a]
user [String]
files
            case Maybe (ShakeOptions, Rules ())
rules of
                Nothing -> (Bool, ShakeOptions, Either SomeException ())
-> IO (Bool, ShakeOptions, Either SomeException ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
False, ShakeOptions
shakeOpts, () -> Either SomeException ()
forall a b. b -> Either a b
Right ())
                Just (shakeOpts :: ShakeOptions
shakeOpts, rules :: Rules ()
rules) -> do
                    Either SomeException ()
res <- IO () -> IO (Either SomeException ())
forall a. IO a -> IO (Either SomeException a)
try_ (IO () -> IO (Either SomeException ()))
-> IO () -> IO (Either SomeException ())
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> Rules () -> IO ()
shake ShakeOptions
shakeOpts (Rules () -> IO ()) -> Rules () -> IO ()
forall a b. (a -> b) -> a -> b
$
                        if Extra
NoBuild Extra -> [Extra] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then Rules () -> Rules ()
withoutActions Rules ()
rules else Rules ()
rules
                    (Bool, ShakeOptions, Either SomeException ())
-> IO (Bool, ShakeOptions, Either SomeException ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
True, ShakeOptions
shakeOpts, Either SomeException ()
res)

        if Bool -> Bool
not Bool
ran Bool -> Bool -> Bool
|| ShakeOptions -> Verbosity
shakeVerbosity ShakeOptions
shakeOpts Verbosity -> Verbosity -> Bool
forall a. Ord a => a -> a -> Bool
< Verbosity
Normal Bool -> Bool -> Bool
|| Extra
NoTime Extra -> [Extra] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then
            (SomeException -> IO ())
-> (() -> IO ()) -> Either SomeException () -> IO ()
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either SomeException -> IO ()
forall e a. Exception e => e -> IO a
throwIO () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return Either SomeException ()
res
         else
            let esc :: String -> String -> String
esc = if ShakeOptions -> Bool
shakeColor ShakeOptions
shakeOpts then String -> String -> String
escape else (String -> String -> String) -> String -> String -> String
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> String -> String
forall a b. a -> b -> a
const
            in case Either SomeException ()
res of
                Left err :: SomeException
err ->
                    if Extra
Exception Extra -> [Extra] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then
                        SomeException -> IO ()
forall e a. Exception e => e -> IO a
throwIO SomeException
err
                    else do
                        Verbosity -> String -> IO ()
putWhenLn Verbosity
Quiet (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String
esc "31" (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ SomeException -> String
forall a. Show a => a -> String
show SomeException
err
                        IO ()
forall a. IO a
exitFailure
                Right () -> do
                    Double
tot <- IO Double
start
                    let (mins :: Int
mins,secs :: Int
secs) = Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
divMod (Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
ceiling Double
tot) (60 :: Int)
                        time :: String
time = Int -> String
forall a. Show a => a -> String
show Int
mins String -> String -> String
forall a. [a] -> [a] -> [a]
++ ":" String -> String -> String
forall a. [a] -> [a] -> [a]
++ ['0' | Int
secs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 10] String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
secs
                    Verbosity -> String -> IO ()
putWhenLn Verbosity
Normal (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String
esc "32" (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ "Build completed in " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
time String -> String -> String
forall a. [a] -> [a] -> [a]
++ "m"
    where
        opts :: [OptDescr
   (Either String (Either ([Extra], ShakeOptions -> ShakeOptions) a))]
opts = [OptDescr (Either String a)]
-> [OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions))]
-> [OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions))]
forall b a. [OptDescr b] -> [OptDescr a] -> [OptDescr a]
removeOverlap [OptDescr (Either String a)]
userOptions (((Bool,
  OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
 -> OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> [(Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
-> [OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions))]
forall a b. (a -> b) -> [a] -> [b]
map (Bool,
 OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a, b) -> b
snd [(Bool,
  OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
shakeOptsEx) [OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
-> [OptDescr (Either String a)]
-> [OptDescr
      (Either String (Either ([Extra], ShakeOptions -> ShakeOptions) a))]
forall a b.
[OptDescr (Either String a)]
-> [OptDescr (Either String b)]
-> [OptDescr (Either String (Either a b))]
`mergeOptDescr` [OptDescr (Either String a)]
userOptions


-- | A list of command line options that can be used to modify 'ShakeOptions'. Each option returns
--   either an error message (invalid argument to the flag) or a function that changes some fields
--   in 'ShakeOptions'. The command line flags are @make@ compatible where possbile, but additional
--   flags have been added for the extra options Shake supports.
shakeOptDescrs :: [OptDescr (Either String (ShakeOptions -> ShakeOptions))]
shakeOptDescrs :: [OptDescr (Either String (ShakeOptions -> ShakeOptions))]
shakeOptDescrs = [(([Extra], ShakeOptions -> ShakeOptions)
 -> ShakeOptions -> ShakeOptions)
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b.
(a -> b)
-> OptDescr (Either String a) -> OptDescr (Either String b)
fmapOptDescr ([Extra], ShakeOptions -> ShakeOptions)
-> ShakeOptions -> ShakeOptions
forall a b. (a, b) -> b
snd OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
o | (True, o :: OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
o) <- [(Bool,
  OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
shakeOptsEx]

data Extra = ChangeDirectory FilePath
           | Version
           | NumericVersion
           | PrintDirectory Bool
           | Help
           | Sleep
           | NoTime
           | Exception
           | NoBuild
           | ProgressRecord FilePath
           | ProgressReplay FilePath
           | Demo
             deriving Extra -> Extra -> Bool
(Extra -> Extra -> Bool) -> (Extra -> Extra -> Bool) -> Eq Extra
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Extra -> Extra -> Bool
$c/= :: Extra -> Extra -> Bool
== :: Extra -> Extra -> Bool
$c== :: Extra -> Extra -> Bool
Eq


unescape :: String -> String
unescape :: String -> String
unescape ('\ESC':'[':xs :: String
xs) = String -> String
unescape (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Int -> String -> String
forall a. Int -> [a] -> [a]
drop 1 (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isAlpha) String
xs
unescape (x :: Char
x:xs :: String
xs) = Char
x Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
unescape String
xs
unescape [] = []

escape :: String -> String -> String
escape :: String -> String -> String
escape code :: String
code x :: String
x = "\ESC[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
code String -> String -> String
forall a. [a] -> [a] -> [a]
++ "m" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\ESC[0m"

outputColor :: (Verbosity -> String -> IO ()) -> Verbosity -> String -> IO ()
outputColor :: (Verbosity -> String -> IO ()) -> Verbosity -> String -> IO ()
outputColor output :: Verbosity -> String -> IO ()
output v :: Verbosity
v msg :: String
msg = Verbosity -> String -> IO ()
output Verbosity
v (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String
escape "34" String
msg

-- | True if it has a potential effect on ShakeOptions
shakeOptsEx :: [(Bool, OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
shakeOptsEx :: [(Bool,
  OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
shakeOptsEx =
    [OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "a" ["abbrev"] (String
-> String
-> ((String, String) -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a.
String
-> String
-> ((String, String) -> b)
-> ArgDescr (Either String ([a], b))
pairArg "abbrev" "FULL=SHORT" (((String, String) -> ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> ((String, String) -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \a :: (String, String)
a s :: ShakeOptions
s -> ShakeOptions
s{shakeAbbreviations :: [(String, String)]
shakeAbbreviations=ShakeOptions -> [(String, String)]
shakeAbbreviations ShakeOptions
s [(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [(String, String)
a]}) "Use abbreviation in status messages."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-build"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Extra
NoBuild], ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Don't build anything."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "C" ["directory"] ((String -> Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. (String -> a) -> String -> ArgDescr a
ReqArg (\x :: String
x -> ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([String -> Extra
ChangeDirectory String
x],ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "DIRECTORY") "Change to DIRECTORY before doing anything."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["color","colour"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeColor :: Bool
shakeColor=Bool
True}) "Colorize the output."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-color","no-colour"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeColor :: Bool
shakeColor=Bool
False}) "Don't colorize the output."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "d" ["debug"] ((Maybe String
 -> Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg (\x :: Maybe String
x -> ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeVerbosity :: Verbosity
shakeVerbosity=Verbosity
Diagnostic, shakeOutput :: Verbosity -> String -> IO ()
shakeOutput=(Verbosity -> String -> IO ())
-> Maybe String -> Verbosity -> String -> IO ()
outputDebug (ShakeOptions -> Verbosity -> String -> IO ()
shakeOutput ShakeOptions
s) Maybe String
x})) "FILE") "Print lots of debugging information."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["demo"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Extra
Demo], ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Run in demo mode."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["digest"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeChange :: Change
shakeChange=Change
ChangeDigest})) "Files change when digest changes."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["digest-and"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeChange :: Change
shakeChange=Change
ChangeModtimeAndDigest})) "Files change when modtime and digest change."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["digest-and-input"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeChange :: Change
shakeChange=Change
ChangeModtimeAndDigestInput})) "Files change on modtime (and digest for inputs)."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["digest-or"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeChange :: Change
shakeChange=Change
ChangeModtimeOrDigest})) "Files change when modtime or digest change."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["digest-not"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeChange :: Change
shakeChange=Change
ChangeModtime})) "Files change when modtime changes."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["exception"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Extra
Exception], ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Throw exceptions directly."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["flush"] (Double
-> String
-> String
-> (Double -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b a.
(Read a, Ord a, Show a) =>
a
-> String
-> String
-> (a -> b)
-> ArgDescr (Either String ([a], b))
intArg 1 "flush" "N" (\i :: Double
i s :: ShakeOptions
s -> ShakeOptions
s{shakeFlush :: Maybe Double
shakeFlush=Double -> Maybe Double
forall a. a -> Maybe a
Just Double
i})) "Flush metadata every N seconds."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["never-flush"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeFlush :: Maybe Double
shakeFlush=Maybe Double
forall a. Maybe a
Nothing}) "Never explicitly flush metadata."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "h" ["help"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Extra
Help],ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Print this message and exit."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "j" ["jobs"] (Int
-> String
-> String
-> (Maybe Int -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b a.
(Read a, Ord a, Show a) =>
a
-> String
-> String
-> (Maybe a -> b)
-> ArgDescr (Either String ([a], b))
optIntArg 0 "jobs" "N" ((Maybe Int -> ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (Maybe Int -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \i :: Maybe Int
i s :: ShakeOptions
s -> ShakeOptions
s{shakeThreads :: Int
shakeThreads=Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe 0 Maybe Int
i}) "Allow N jobs/threads at once [default CPUs]."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "k" ["keep-going"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeStaunch :: Bool
shakeStaunch=Bool
True}) "Keep going when some targets can't be made."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "l" ["lint"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeLint :: Maybe Lint
shakeLint=Lint -> Maybe Lint
forall a. a -> Maybe a
Just Lint
LintBasic}) "Perform limited validation after the run."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["lint-fsatrace"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeLint :: Maybe Lint
shakeLint=Lint -> Maybe Lint
forall a. a -> Maybe a
Just Lint
LintFSATrace}) "Use fsatrace to do validation."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-lint"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeLint :: Maybe Lint
shakeLint=Maybe Lint
forall a. Maybe a
Nothing}) "Turn off --lint."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["live"] ((Maybe String
 -> Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg (\x :: Maybe String
x -> ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeLiveFiles :: [String]
shakeLiveFiles=ShakeOptions -> [String]
shakeLiveFiles ShakeOptions
s [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe "live.txt" Maybe String
x]})) "FILE") "List the files that are live [to live.txt]."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "m" ["metadata"] (String
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a.
String -> (String -> b) -> ArgDescr (Either a ([a], b))
reqArg "PREFIX" ((String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \x :: String
x s :: ShakeOptions
s -> ShakeOptions
s{shakeFiles :: String
shakeFiles=String
x}) "Prefix for storing metadata files."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["numeric-version"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Extra
NumericVersion],ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Print just the version number and exit."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["skip-commands"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeRunCommands :: Bool
shakeRunCommands=Bool
False}) "Try and avoid running external programs."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["rebuild"] ((Maybe String
 -> Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg (\x :: Maybe String
x -> ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeRebuild :: [(Rebuild, String)]
shakeRebuild=ShakeOptions -> [(Rebuild, String)]
shakeRebuild ShakeOptions
s [(Rebuild, String)] -> [(Rebuild, String)] -> [(Rebuild, String)]
forall a. [a] -> [a] -> [a]
++ [(Rebuild
RebuildNow, String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe "**" Maybe String
x)]})) "PATTERN") "Rebuild matching files."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-rebuild"] ((Maybe String
 -> Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg (\x :: Maybe String
x -> ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeRebuild :: [(Rebuild, String)]
shakeRebuild=ShakeOptions -> [(Rebuild, String)]
shakeRebuild ShakeOptions
s [(Rebuild, String)] -> [(Rebuild, String)] -> [(Rebuild, String)]
forall a. [a] -> [a] -> [a]
++ [(Rebuild
RebuildNormal, String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe "**" Maybe String
x)]})) "PATTERN") "Rebuild matching files if necessary."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["skip"] ((Maybe String
 -> Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg (\x :: Maybe String
x -> ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeRebuild :: [(Rebuild, String)]
shakeRebuild=ShakeOptions -> [(Rebuild, String)]
shakeRebuild ShakeOptions
s [(Rebuild, String)] -> [(Rebuild, String)] -> [(Rebuild, String)]
forall a. [a] -> [a] -> [a]
++ [(Rebuild
RebuildLater, String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe "**" Maybe String
x)]})) "PATTERN") "Don't rebuild matching files this run."
--    ,yes $ Option ""  ["skip-forever"] (OptArg (\x -> Right ([], \s -> s{shakeRebuild=shakeRebuild s ++ [(RebuildNever, fromMaybe "**" x)]})) "PATTERN") "Don't rebuild matching files until they change."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "r" ["report","profile"] ((Maybe String
 -> Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg (\x :: Maybe String
x -> ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([], \s :: ShakeOptions
s -> ShakeOptions
s{shakeReport :: [String]
shakeReport=ShakeOptions -> [String]
shakeReport ShakeOptions
s [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe "report.html" Maybe String
x]})) "FILE") "Write out profiling information [to report.html]."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-reports"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeReport :: [String]
shakeReport=[]}) "Turn off --report."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["rule-version"] (String
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a.
String -> (String -> b) -> ArgDescr (Either a ([a], b))
reqArg "VERSION" ((String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \x :: String
x s :: ShakeOptions
s -> ShakeOptions
s{shakeVersion :: String
shakeVersion=String
x}) "Version of the build rules."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-rule-version"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeVersionIgnore :: Bool
shakeVersionIgnore=Bool
True}) "Ignore the build rules version."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "s" ["silent"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeVerbosity :: Verbosity
shakeVerbosity=Verbosity
Silent}) "Don't print anything."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["sleep"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Extra
Sleep],ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Sleep for a second before building."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "S" ["no-keep-going","stop"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeStaunch :: Bool
shakeStaunch=Bool
False}) "Turns off -k."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["storage"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeStorageLog :: Bool
shakeStorageLog=Bool
True}) "Write a storage log."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "p" ["progress"] (ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a a.
ArgDescr (Either a ([Extra], a -> a))
-> ArgDescr (Either a ([Extra], a -> a))
progress (ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ Double
-> String
-> String
-> (Maybe Double -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b a.
(Read a, Ord a, Show a) =>
a
-> String
-> String
-> (Maybe a -> b)
-> ArgDescr (Either String ([a], b))
optIntArg 1 "progress" "N" ((Maybe Double -> ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (Maybe Double -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \i :: Maybe Double
i s :: ShakeOptions
s -> ShakeOptions
s{shakeProgress :: IO Progress -> IO ()
shakeProgress=Double -> IO Progress -> IO ()
prog (Double -> IO Progress -> IO ()) -> Double -> IO Progress -> IO ()
forall a b. (a -> b) -> a -> b
$ Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe 5 Maybe Double
i}) "Show progress messages [every N secs, default 5]."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-progress"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeProgress :: IO Progress -> IO ()
shakeProgress=IO () -> IO Progress -> IO ()
forall a b. a -> b -> a
const (IO () -> IO Progress -> IO ()) -> IO () -> IO Progress -> IO ()
forall a b. (a -> b) -> a -> b
$ () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()}) "Don't show progress messages."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "q" ["quiet"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeVerbosity :: Verbosity
shakeVerbosity=Verbosity -> (Int -> Int) -> Verbosity
move (ShakeOptions -> Verbosity
shakeVerbosity ShakeOptions
s) Int -> Int
forall a. Enum a => a -> a
pred}) "Print less (pass repeatedly for even less)."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-time"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Extra
NoTime],ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Don't print build time."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["timings"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeTimings :: Bool
shakeTimings=Bool
True}) "Print phase timings."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
yes (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "V" ["verbose","trace"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall b a a. b -> ArgDescr (Either a ([a], b))
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \s :: ShakeOptions
s -> ShakeOptions
s{shakeVerbosity :: Verbosity
shakeVerbosity=Verbosity -> (Int -> Int) -> Verbosity
move (ShakeOptions -> Verbosity
shakeVerbosity ShakeOptions
s) Int -> Int
forall a. Enum a => a -> a
succ}) "Print more (pass repeatedly for even more)."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "v" ["version"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Extra
Version],ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Print the version number and exit."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option "w" ["print-directory"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Bool -> Extra
PrintDirectory Bool
True],ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Print the current directory."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall b. b -> (Bool, b)
no  (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option ""  ["no-print-directory"] (Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. a -> ArgDescr a
NoArg (Either String ([Extra], ShakeOptions -> ShakeOptions)
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([Bool -> Extra
PrintDirectory Bool
False],ShakeOptions -> ShakeOptions
forall a. a -> a
id)) "Turn off -w, even if it was turned on implicitly."
    ]
    where
        yes :: b -> (Bool, b)
yes = (,) Bool
True
        no :: b -> (Bool, b)
no  = (,) Bool
False

        move :: Verbosity -> (Int -> Int) -> Verbosity
        move :: Verbosity -> (Int -> Int) -> Verbosity
move x :: Verbosity
x by :: Int -> Int
by = Int -> Verbosity
forall a. Enum a => Int -> a
toEnum (Int -> Verbosity) -> Int -> Verbosity
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Verbosity -> Int
forall a. Enum a => a -> Int
fromEnum Verbosity
mx) (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
forall a. Ord a => a -> a -> a
max (Verbosity -> Int
forall a. Enum a => a -> Int
fromEnum Verbosity
mn) (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int -> Int
by (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Verbosity -> Int
forall a. Enum a => a -> Int
fromEnum Verbosity
x
            where (mn :: Verbosity
mn,mx :: Verbosity
mx) = (Verbosity -> Verbosity -> Verbosity
forall a. a -> a -> a
asTypeOf Verbosity
forall a. Bounded a => a
minBound Verbosity
x, Verbosity -> Verbosity -> Verbosity
forall a. a -> a -> a
asTypeOf Verbosity
forall a. Bounded a => a
maxBound Verbosity
x)

        noArg :: b -> ArgDescr (Either a ([a], b))
noArg f :: b
f = Either a ([a], b) -> ArgDescr (Either a ([a], b))
forall a. a -> ArgDescr a
NoArg (Either a ([a], b) -> ArgDescr (Either a ([a], b)))
-> Either a ([a], b) -> ArgDescr (Either a ([a], b))
forall a b. (a -> b) -> a -> b
$ ([a], b) -> Either a ([a], b)
forall a b. b -> Either a b
Right ([], b
f)
        reqArg :: String -> (String -> b) -> ArgDescr (Either a ([a], b))
reqArg a :: String
a f :: String -> b
f = (String -> Either a ([a], b))
-> String -> ArgDescr (Either a ([a], b))
forall a. (String -> a) -> String -> ArgDescr a
ReqArg (\x :: String
x -> ([a], b) -> Either a ([a], b)
forall a b. b -> Either a b
Right ([], String -> b
f String
x)) String
a
        intArg :: a
-> String
-> String
-> (a -> b)
-> ArgDescr (Either String ([a], b))
intArg mn :: a
mn flag :: String
flag a :: String
a f :: a -> b
f = ((String -> Either String ([a], b))
 -> String -> ArgDescr (Either String ([a], b)))
-> String
-> (String -> Either String ([a], b))
-> ArgDescr (Either String ([a], b))
forall a b c. (a -> b -> c) -> b -> a -> c
flip (String -> Either String ([a], b))
-> String -> ArgDescr (Either String ([a], b))
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String
a ((String -> Either String ([a], b))
 -> ArgDescr (Either String ([a], b)))
-> (String -> Either String ([a], b))
-> ArgDescr (Either String ([a], b))
forall a b. (a -> b) -> a -> b
$ \x :: String
x -> case ReadS a
forall a. Read a => ReadS a
reads String
x of
            [(i :: a
i,"")] | a
i a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
mn -> ([a], b) -> Either String ([a], b)
forall a b. b -> Either a b
Right ([],a -> b
f a
i)
            _ -> String -> Either String ([a], b)
forall a b. a -> Either a b
Left (String -> Either String ([a], b))
-> String -> Either String ([a], b)
forall a b. (a -> b) -> a -> b
$ "the `--" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
flag String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' option requires a number, " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
mn String -> String -> String
forall a. [a] -> [a] -> [a]
++ " or above"
        optIntArg :: a
-> String
-> String
-> (Maybe a -> b)
-> ArgDescr (Either String ([a], b))
optIntArg mn :: a
mn flag :: String
flag a :: String
a f :: Maybe a -> b
f = ((Maybe String -> Either String ([a], b))
 -> String -> ArgDescr (Either String ([a], b)))
-> String
-> (Maybe String -> Either String ([a], b))
-> ArgDescr (Either String ([a], b))
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Maybe String -> Either String ([a], b))
-> String -> ArgDescr (Either String ([a], b))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg String
a ((Maybe String -> Either String ([a], b))
 -> ArgDescr (Either String ([a], b)))
-> (Maybe String -> Either String ([a], b))
-> ArgDescr (Either String ([a], b))
forall a b. (a -> b) -> a -> b
$ Either String ([a], b)
-> (String -> Either String ([a], b))
-> Maybe String
-> Either String ([a], b)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (([a], b) -> Either String ([a], b)
forall a b. b -> Either a b
Right ([], Maybe a -> b
f Maybe a
forall a. Maybe a
Nothing)) ((String -> Either String ([a], b))
 -> Maybe String -> Either String ([a], b))
-> (String -> Either String ([a], b))
-> Maybe String
-> Either String ([a], b)
forall a b. (a -> b) -> a -> b
$ \x :: String
x -> case ReadS a
forall a. Read a => ReadS a
reads String
x of
            [(i :: a
i,"")] | a
i a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
mn -> ([a], b) -> Either String ([a], b)
forall a b. b -> Either a b
Right ([],Maybe a -> b
f (Maybe a -> b) -> Maybe a -> b
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
i)
            _ -> String -> Either String ([a], b)
forall a b. a -> Either a b
Left (String -> Either String ([a], b))
-> String -> Either String ([a], b)
forall a b. (a -> b) -> a -> b
$ "the `--" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
flag String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' option requires a number, " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
mn String -> String -> String
forall a. [a] -> [a] -> [a]
++ " or above"
        pairArg :: String
-> String
-> ((String, String) -> b)
-> ArgDescr (Either String ([a], b))
pairArg flag :: String
flag a :: String
a f :: (String, String) -> b
f = ((String -> Either String ([a], b))
 -> String -> ArgDescr (Either String ([a], b)))
-> String
-> (String -> Either String ([a], b))
-> ArgDescr (Either String ([a], b))
forall a b c. (a -> b -> c) -> b -> a -> c
flip (String -> Either String ([a], b))
-> String -> ArgDescr (Either String ([a], b))
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String
a ((String -> Either String ([a], b))
 -> ArgDescr (Either String ([a], b)))
-> (String -> Either String ([a], b))
-> ArgDescr (Either String ([a], b))
forall a b. (a -> b) -> a -> b
$ \x :: String
x -> case (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '=') String
x of
            (a :: String
a,'=':b :: String
b) -> ([a], b) -> Either String ([a], b)
forall a b. b -> Either a b
Right ([],(String, String) -> b
f (String
a,String
b))
            _ -> String -> Either String ([a], b)
forall a b. a -> Either a b
Left (String -> Either String ([a], b))
-> String -> Either String ([a], b)
forall a b. (a -> b) -> a -> b
$ "the `--" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
flag String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' option requires an = in the argument"

        progress :: ArgDescr (Either a ([Extra], a -> a))
-> ArgDescr (Either a ([Extra], a -> a))
progress (OptArg func :: Maybe String -> Either a ([Extra], a -> a)
func msg :: String
msg) = ((Maybe String -> Either a ([Extra], a -> a))
 -> String -> ArgDescr (Either a ([Extra], a -> a)))
-> String
-> (Maybe String -> Either a ([Extra], a -> a))
-> ArgDescr (Either a ([Extra], a -> a))
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Maybe String -> Either a ([Extra], a -> a))
-> String -> ArgDescr (Either a ([Extra], a -> a))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg String
msg ((Maybe String -> Either a ([Extra], a -> a))
 -> ArgDescr (Either a ([Extra], a -> a)))
-> (Maybe String -> Either a ([Extra], a -> a))
-> ArgDescr (Either a ([Extra], a -> a))
forall a b. (a -> b) -> a -> b
$ \x :: Maybe String
x -> case (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '=') (String -> (String, String))
-> Maybe String -> Maybe (String, String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Maybe String
x of
            Just ("record",file :: String
file) -> ([Extra], a -> a) -> Either a ([Extra], a -> a)
forall a b. b -> Either a b
Right ([String -> Extra
ProgressRecord (String -> Extra) -> String -> Extra
forall a b. (a -> b) -> a -> b
$ if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
file then "progress.txt" else String -> String
forall a. [a] -> [a]
tail String
file], a -> a
forall a. a -> a
id)
            Just ("replay",file :: String
file) -> ([Extra], a -> a) -> Either a ([Extra], a -> a)
forall a b. b -> Either a b
Right ([String -> Extra
ProgressReplay (String -> Extra) -> String -> Extra
forall a b. (a -> b) -> a -> b
$ if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
file then "progress.txt" else String -> String
forall a. [a] -> [a]
tail String
file], a -> a
forall a. a -> a
id)
            _ -> Maybe String -> Either a ([Extra], a -> a)
func Maybe String
x

        outputDebug :: (Verbosity -> String -> IO ())
-> Maybe String -> Verbosity -> String -> IO ()
outputDebug output :: Verbosity -> String -> IO ()
output Nothing = Verbosity -> String -> IO ()
output
        outputDebug output :: Verbosity -> String -> IO ()
output (Just file :: String
file) = \v :: Verbosity
v msg :: String
msg -> do
            Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Verbosity
v Verbosity -> Verbosity -> Bool
forall a. Eq a => a -> a -> Bool
/= Verbosity
Diagnostic) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Verbosity -> String -> IO ()
output Verbosity
v String
msg
            String -> String -> IO ()
appendFile String
file (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> String
unescape String
msg String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\n"

        prog :: Double -> IO Progress -> IO ()
prog i :: Double
i p :: IO Progress
p = do
            String -> IO ()
program <- IO (String -> IO ())
progressProgram
            Double -> (String -> IO ()) -> IO Progress -> IO ()
progressDisplay Double
i (\s :: String
s -> String -> IO ()
progressTitlebar String
s IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
program String
s) IO Progress
p