futhark-0.17.3: src/Futhark/CLI/Misc.hs
{-# LANGUAGE FlexibleContexts #-}
-- | Various small subcommands that are too simple to deserve their own file.
module Futhark.CLI.Misc
( mainImports,
mainDataget,
)
where
import Control.Monad.State
import qualified Data.ByteString.Lazy as BS
import Data.Function (on)
import Data.List (isInfixOf, isPrefixOf, nubBy)
import Futhark.Compiler
import Futhark.Test
import Futhark.Util.Options
import System.Environment (getExecutablePath)
import System.Exit
import System.FilePath
import System.IO
-- | @futhark imports@
mainImports :: String -> [String] -> IO ()
mainImports = mainWithOptions () [] "program" $ \args () ->
case args of
[file] -> Just $ do
(_, prog_imports, _) <- readProgramOrDie file
liftIO $
putStr $
unlines $
map (++ ".fut") $
filter (\f -> not ("prelude/" `isPrefixOf` f)) $
map fst prog_imports
_ -> Nothing
-- | @futhark dataget@
mainDataget :: String -> [String] -> IO ()
mainDataget = mainWithOptions () [] "program dataset" $ \args () ->
case args of
[file, dataset] -> Just $ dataget file dataset
_ -> Nothing
where
dataget prog dataset = do
let dir = takeDirectory prog
runs <- testSpecRuns <$> testSpecFromFileOrDie prog
let exact = filter ((dataset ==) . runDescription) runs
infixes = filter ((dataset `isInfixOf`) . runDescription) runs
futhark <- FutharkExe <$> getExecutablePath
case nubBy ((==) `on` runDescription) $
if null exact then infixes else exact of
[x] -> BS.putStr =<< getValuesBS futhark dir (runInput x)
[] -> do
hPutStr stderr $ "No dataset '" ++ dataset ++ "'.\n"
hPutStr stderr "Available datasets:\n"
mapM_ (hPutStrLn stderr . (" " ++) . runDescription) runs
exitFailure
runs' -> do
hPutStr stderr $ "Dataset '" ++ dataset ++ "' ambiguous:\n"
mapM_ (hPutStrLn stderr . (" " ++) . runDescription) runs'
exitFailure
testSpecRuns = testActionRuns . testAction
testActionRuns CompileTimeFailure {} = []
testActionRuns (RunCases ios _ _) = concatMap iosTestRuns ios