+waitForJobs jids client = waitForJobs' 500000 15000000
+ where
+ waitForJobs' delay maxdelay = do
+ -- TODO: this should use WaitForJobChange once it's available in Haskell
+ -- land, instead of a fixed schedule of sleeping intervals.
+ threadDelay $ min delay maxdelay
+ sts <- L.queryJobsStatus client jids
+ case sts of
+ Bad e -> return . Bad $ "Checking job status: " ++ formatError e
+ Ok sts' -> if any (<= JOB_STATUS_RUNNING) sts' then
+ waitForJobs' (delay * 2) maxdelay
+ else
+ return . Ok $ zip jids sts'
+
+-- | Execute jobs and return @Ok@ only if all of them succeeded.
+execJobsWaitOk :: [[MetaOpCode]] -> L.Client -> IO (Result ())
+execJobsWaitOk opcodes client = do
+ let nullog = const (return () :: IO ())
+ failed = filter ((/=) JOB_STATUS_SUCCESS . snd)
+ fmtfail (i, s) = show (fromJobId i) ++ "=>" ++ jobStatusToRaw s
+ sts <- execJobsWait opcodes nullog client