Subversion

Galculator

?curdirlinks? - Rev 3

?prevdifflink? - Blame



{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -Wall #-}
 
-------------------------------------------------------------------------------

{- |
Module      :  Language.Module.TypeInference
Description :  Type inference for the module representation.
Copyright   :  (c) Paulo Silva
License     :  LGPL
 
Maintainer  :  paufil@di.uminho.pt
Stability   :  experimental
Portability :  portable
 
-}


-------------------------------------------------------------------------------

module Language.Module.TypeInference (
  infer
 ) where

import Control.GalcError
import Control.MonadOr
import Control.Monad.Error
import Control.Monad.Fresh
import Data.Existential
import qualified Data.Map as Map
import qualified Language.Law.Syntax as LS
import qualified Language.Law.TypeInference as L
import Language.Module.Syntax
import Language.Module.SyntaxADT
import qualified Language.R.TypeInference as R
import Language.R.Syntax

-------------------------------------------------------------------------------

infer :: (MonadError GalcError m, MonadFresh [String] String m, MonadOr m)
      => ModuleS -> m Module
infer (ModuleS nm laws' gcs' defs') = do
  laws'' <- mapM L.infer laws'
  gcs''  <- mapM R.infer gcs'
  defs'' <- mapM R.infer defs'
  return $ Module {
    name = nm,
    laws = Map.fromList . map (\x -> (LS.getName x, x)) $ laws'',
    gcs = Map.fromList . map (\x -> (gcName x, x)) $ gcs'',
    definitions = Map.fromList . map (\x -> (defName x, x)) $ defs'' }

-------------------------------------------------------------------------------

gcName :: RType -> String
gcName (Exists _ (GDef n _ _ _ _)) = n
gcName _ = ""

-------------------------------------------------------------------------------

defName :: RType -> String
defName (Exists _ (DEF n _)) = n
defName _ = ""

-------------------------------------------------------------------------------
 

Theme by Vikram Singh | Powered by WebSVN v2.3.3