packages feed

pointfree-1.0: Main.hs

module Main where

import Plugin.Pl.Common
import Plugin.Pl.Optimize
import Plugin.Pl.Parser
import Plugin.Pl.Transform

import Data.List (intersperse)
import System.Environment (getArgs)
import System.Console.GetOpt

data Flag = Verbose 
  deriving Eq

options :: [OptDescr Flag]
options = [ Option ['v'] ["verbose"] (NoArg Verbose) "verbose results"]

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))

main :: IO ()
main = do
  args <- getArgs
  (flags, nonOptions) <- parseArgs args
  if null nonOptions
     then putStrLn $ usageInfo header options
     else let query = concat $ intersperse " " nonOptions
              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
               print $ d'
               putStrLn "Optimized expression:"
               mapM_ print $ mapTopLevel' optimize d'
       else print $ last $ mapTopLevel' optimize $ mapTopLevel transform d
  Left err -> putStrLn err