{-# LANGUAGE TupleSections #-}
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
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
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
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
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
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 = 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
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."
,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