packages feed

caledon-2.0.0.0: Main.hs

module Main where

import AST
import Choice
import HOU
import Parser
import System.Environment
import Data.Functor
import Data.Foldable as F (forM_)
import Data.List (partition)
import Text.Parsec
import Data.Monoid
import Control.Arrow (first)

-----------------------------------------------------------------------
-------------------------- MAIN ---------------------------------------
-----------------------------------------------------------------------
checkAndRun decs = do

  putStrLn "\nFILE: "
  forM_ decs $ \s -> putStrLn $ show s++"\n"

  putStrLn "\nTYPE CHECKING: "
  decs <- case runError $ typeCheckAll decs of
    Left e -> error e
    Right e -> putStrLn "Type checking success!" >> return e
  let (defs,others)  = flip partition decs $ \x -> case x of
        Define {} -> True
        _ -> False
      
      sub = subst $ foldr (\a r -> r *** (predName a |-> subst r (predValue a))) mempty defs
      (predicates, targets) = flip partition others $ \x -> case x of
        Predicate {} -> True
        _ -> False

  putStrLn "\nAXIOMS: "
  forM_ (defs++predicates) $ \s -> putStrLn $ show s++"\n"

  putStrLn "\nTARGETS: "
  forM_ targets $ \s -> putStrLn $ show s++"\n"

  let allTypes c = (predName c, predType c):predConstructors c
      predicates' = sub predicates
      targets' = sub targets
  forM_ targets' $ \target ->
    case solver (concatMap allTypes predicates') $ predType target of
      Left e -> putStrLn $ "ERROR: "++e
      Right sub -> putStrLn $
                   "\nTARGET: \n"++show target
                   ++"\n\nSOLVED WITH:\n"
                   ++concatMap (\(a,b) -> a++" => "++show b++"\n") sub

main = do
  fnames <- getArgs
  case fnames of
    [] -> putStrLn "No file specified. Usage is \"caledon file.ncc\""
    [fname] -> do
      file <- readFile fname
      
      let mError = runP decls emptyState fname file 
      decs <- case mError of
        Left e -> error $ show e
        Right l -> return l
      checkAndRun decs
    _ -> putStrLn "Unrecognized arguments. Usage is \"caledon file.ncc\""