Subversion

Galculator

?curdirlinks? - Rev 7

?prevdifflink? - Blame



{-# LANGUAGE GADTs, PatternSignatures, FlexibleContexts #-}
{-# OPTIONS_GHC -Wall #-}
 
-------------------------------------------------------------------------------

{- |
Module      :  Language.Type.Constraint
Description :  Type equation constraints for type representation.
Copyright   :  (c) Paulo Silva
License     :  LGPL
 
Maintainer  :  paufil@di.uminho.pt
Stability   :  experimental
Portability :  portable
 
-}


-------------------------------------------------------------------------------
 
module Language.Type.Constraint  (
  Constraint(..),
  constraint2Rule,
  typeRewrite,
  typeRewriteE
 ) where

import Control.GalcError
import Control.Monad.Error
import Control.MonadOr
import Language.Type.Equality
import Language.Type.Rewrite
import Language.Type.Syntax

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

data Constraint where
  (:=:) :: Type a -> Type b -> Constraint

instance Show Constraint where
  show (t1 :=: t2) = show t1 ++ " = " ++ show t2
 
instance Eq Constraint where
  (a :=: b) == (a' :=: b') = beq a a' && beq b b'

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

constraint2Rule :: Constraint -> Rule
constraint2Rule (t1 :=: t2) t1' =
  if beq t1 t1' then return $ View t2 else mzero

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

typeRewrite :: MonadOr m => [Constraint] -> Type t -> m TypeBox
typeRewrite constr t = do
  let rules::[Rule] = map constraint2Rule constr
  return . view2Box =<< everywhere (try (seqRules rules)) t

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

typeRewriteE :: MonadError GalcError m => [Constraint] -> Type t -> m TypeBox
typeRewriteE constr t =
  maybe2error (RewriteError (show t)) . typeRewrite constr $ t

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

Theme by Vikram Singh | Powered by WebSVN v2.3.3