Permalink
Fetching contributors…
Cannot retrieve contributors at this time
57 lines (46 sloc) 1.63 KB
module Main where
import Plugin.Pl.Common
import Plugin.Pl.Optimize
import Plugin.Pl.Parser
import Plugin.Pl.PrettyPrinter
import Plugin.Pl.Transform
import System.Environment (getArgs)
import System.Console.GetOpt
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 (concat 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