module Main where import Data.Foldable import Plugin.Pl.Common import Plugin.Pl.Optimize import Plugin.Pl.Parser import Plugin.Pl.PrettyPrinter import Plugin.Pl.Transform import System.Console.GetOpt import System.Environment (getArgs) data Flag = Verbose | StdIn deriving Eq options :: [OptDescr Flag] options = [ Option ['v'] ["verbose"] (NoArg Verbose) "verbose results" , Option [] ["stdin"] (NoArg StdIn) "read from stdin" ] header :: String header = "Usage: pointfree [OPTION...] query" parseArgs :: [String] -> IO ([Flag], [String]) parseArgs args = case getOpt Permute options args of (flags, nonOptions, []) -> return (flags, nonOptions) (_, _, errs) -> ioError (userError (fold errs ++ usageInfo header options)) getQuery :: [Flag] -> [String] -> IO String getQuery flags nonOptions | StdIn `elem` flags = getLine | otherwise = return $ unwords nonOptions main :: IO () main = do args <- getArgs (flags, nonOptions) <- parseArgs args query <- getQuery flags nonOptions if null query then putStrLn $ usageInfo header options else let verbose = Verbose `elem` flags in pf query verbose pf :: String -> Bool -> IO () pf input verbose = case parsePF input of Right d -> if verbose then do putStrLn "Transformed to pointfree style:" let d' = mapTopLevel transform d putStrLn $ prettyTopLevel d' putStrLn "Optimized expression:" mapM_ (putStrLn . prettyTopLevel) $ mapTopLevel' optimize d' else putStrLn . prettyTopLevel . last . mapTopLevel' optimize $ mapTopLevel transform d Left err -> putStrLn err