packages feed

infernu-0.0.0.0: Main.hs

module Main (main) where

import           Control.Monad       (forM, when)
import qualified Options.Applicative as OptParse
import           System.Exit         (exitFailure)
import qualified Text.Parsec.Pos     as Pos

import           Infernu.Infer       (pretty)
import           Infernu.Options     (Options (..), opts)
import           Infernu.Types       (QualType, Source (..))
import           Infernu.Util

process :: [(Source, QualType)] -> [(Pos.SourceName, [String])] -> String
process ts sourceCodes = concatMap (\(f, ds) -> annotatedSource (filteredTypes f ts) ds) sourceCodes
    where filteredTypes f' = filter (\(Source (_, p), _) -> (Pos.sourceName p == f'))

main :: IO ()
main = do
    options <- OptParse.execParser opts
    let files = optFileNames options
    res <- checkFiles options files
    case res of
        Right ts -> when (not $ optQuiet options) $ do sourceCodes <- forM files $ \f -> do d <- readFile f
                                                                                            return (f, lines d)
                                                       putStrLn $ process ts sourceCodes
        Left e -> putStrLn (pretty e) >> exitFailure