module Initialize (initialize) where

import Control.Monad.Error

import Ast
import Parser (parseProgram)
import Hints
import Unify
import Rename
import Optimize

initialize str = do
  (Module name ex im defs, tipes) <- parseProgram str
  let expr = rename . Let defs $ Var "_"
  subs <- unify (liftM2 (++) hints tipes) expr
  let Let defs' _ = optimize expr
  let im' = if any ((=="Prelude") . fst) im then im else ("Prelude", Importing []):im
  return (subs `seq` Module name ex im' defs')