Line No. | Rev | Author | Line |
---|---|---|---|
1 | 1 | paulosilva | |
2 | 7 | paulosilva | {-# LANGUAGE GADTs, PatternSignatures, FlexibleContexts #-} |
3 | 1 | paulosilva | {-# OPTIONS_GHC -Wall #-} |
4 | |||
5 | ------------------------------------------------------------------------------- | ||
6 | |||
7 | {- | | ||
8 | Module : Language.Type.Constraint | ||
9 | Description : Type equation constraints for type representation. | ||
10 | Copyright : (c) Paulo Silva | ||
11 | License : LGPL | ||
12 | |||
13 | Maintainer : paufil@di.uminho.pt | ||
14 | Stability : experimental | ||
15 | Portability : portable | ||
16 | |||
17 | -} | ||
18 | |||
19 | ------------------------------------------------------------------------------- | ||
20 | |||
21 | module Language.Type.Constraint ( | ||
22 | Constraint(..), | ||
23 | 3 | paulosilva | constraint2Rule, |
24 | 7 | paulosilva | typeRewrite, |
25 | typeRewriteE | ||
26 | 1 | paulosilva | ) where |
27 | |||
28 | 7 | paulosilva | import Control.GalcError |
29 | import Control.Monad.Error | ||
30 | 3 | paulosilva | import Control.MonadOr |
31 | 1 | paulosilva | import Language.Type.Equality |
32 | import Language.Type.Rewrite | ||
33 | import Language.Type.Syntax | ||
34 | |||
35 | ------------------------------------------------------------------------------- | ||
36 | |||
37 | data Constraint where | ||
38 | (:=:) :: Type a -> Type b -> Constraint | ||
39 | |||
40 | instance Show Constraint where | ||
41 | show (t1 :=: t2) = show t1 ++ " = " ++ show t2 | ||
42 | |||
43 | instance Eq Constraint where | ||
44 | (a :=: b) == (a' :=: b') = beq a a' && beq b b' | ||
45 | |||
46 | ------------------------------------------------------------------------------- | ||
47 | |||
48 | constraint2Rule :: Constraint -> Rule | ||
49 | constraint2Rule (t1 :=: t2) t1' = | ||
50 | if beq t1 t1' then return $ View t2 else mzero | ||
51 | |||
52 | ------------------------------------------------------------------------------- | ||
53 | |||
54 | 3 | paulosilva | typeRewrite :: MonadOr m => [Constraint] -> Type t -> m TypeBox |
55 | 1 | paulosilva | typeRewrite constr t = do |
56 | let rules::[Rule] = map constraint2Rule constr | ||
57 | 3 | paulosilva | return . view2Box =<< everywhere (try (seqRules rules)) t |
58 | 1 | paulosilva | |
59 | ------------------------------------------------------------------------------- | ||
60 | 7 | paulosilva | |
61 | typeRewriteE :: MonadError GalcError m => [Constraint] -> Type t -> m TypeBox | ||
62 | typeRewriteE constr t = | ||
63 | maybe2error (RewriteError (show t)) . typeRewrite constr $ t | ||
64 | |||
65 | ------------------------------------------------------------------------------- |