Subversion

Galculator

?curdirlinks? -

Blame information for rev 2

Line No. Rev Author Line
1 1 paulosilva  
2 {-# LANGUAGE GADTs, Rank2Types #-}
3 {-# OPTIONS_GHC -Wall #-}
4  
5 -------------------------------------------------------------------------------
6  
7 {- |
8 Module      :  Language.Type.Rewrite
9 Description :  Strategic rewriting combinators for the 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.Rewrite (
22   Rule,
23   View(View),
24   showType,
25   view2Box,
26   nop,
27   fail,
28   seqRules,
29   (>>>),
30   (|||),
31 2 paulosilva   (|<|),
32 1 paulosilva   many,
33   many1,
34   try,
35   once,
36   everywhere,
37   everywhere',
38   innermost,
39 2 paulosilva   one,
40 1 paulosilva   all
41  ) where
42  
43 2 paulosilva import Control.MonadOr
44 1 paulosilva import Control.Monad hiding (fail)
45 import Data.Existential
46 import Language.Type.Syntax
47 import Prelude hiding (all,fail)
48  
49 -------------------------------------------------------------------------------
50  
51 data View a where
52   View :: Type b -> View (Type a)
53  
54 instance Show (View a) where
55   show (View b) = "View: " ++ show b
56  
57 -------------------------------------------------------------------------------
58  
59 showType :: View a -> String
60 showType (View b) = show b
61  
62 -------------------------------------------------------------------------------
63  
64 view2Box :: View (Type b) -> TypeBox
65 view2Box (View t) = Hide t
66  
67 -------------------------------------------------------------------------------
68  
69 2 paulosilva type Rule = forall a . forall m . MonadOr m => Type a -> m (View (Type a))
70 1 paulosilva  
71 -------------------------------------------------------------------------------
72  
73 nop :: Rule
74 nop = return . View
75  
76 -------------------------------------------------------------------------------
77  
78 fail :: Rule
79 fail _ = mzero
80  
81 -------------------------------------------------------------------------------
82  
83 seqRules :: [Rule] -> Rule
84 seqRules [] = fail
85 2 paulosilva seqRules (x:xs) = x |<| seqRules xs
86 1 paulosilva  
87 -------------------------------------------------------------------------------
88  
89 (>>>) :: Rule -> Rule -> Rule
90 (f >>> g) a = do
91   View b <- f a
92   View c <- g b
93   return $ View c
94  
95 -------------------------------------------------------------------------------
96  
97 (|||) :: Rule -> Rule -> Rule
98 (f ||| g) x = f x `mplus` g x
99  
100 -------------------------------------------------------------------------------
101  
102 2 paulosilva (|<|) :: Rule -> Rule -> Rule
103 (f |<| g) x = f x `morelse` g x
104  
105 -------------------------------------------------------------------------------
106  
107 1 paulosilva many :: Rule -> Rule
108 2 paulosilva many r = (r >>> many r) |<| nop
109 1 paulosilva  
110 -------------------------------------------------------------------------------
111  
112 many1 :: Rule -> Rule
113 many1 r = r >>> many r
114  
115 -------------------------------------------------------------------------------
116  
117 try :: Rule -> Rule
118 2 paulosilva try r = r |<| nop
119 1 paulosilva  
120 -------------------------------------------------------------------------------
121  
122 once :: Rule -> Rule
123 2 paulosilva once f = f |<| one (once f)
124 1 paulosilva  
125 -------------------------------------------------------------------------------
126  
127 everywhere :: Rule -> Rule
128 everywhere r = r >>> all (everywhere r)
129  
130 -------------------------------------------------------------------------------
131  
132 everywhere' :: Rule -> Rule
133 everywhere' r = all (everywhere' r) >>> r
134  
135 -------------------------------------------------------------------------------
136  
137 innermost :: Rule -> Rule
138 innermost r = all (innermost r) >>> try (r >>> innermost r)
139  
140 -------------------------------------------------------------------------------
141  
142 all :: Rule -> Rule
143 2 paulosilva all _ x@(TVar _) = return $ View x
144 all _ One = return $ View One
145 all _ Bool = return $ View Bool
146 all _ Char = return $ View Char
147 all _ String = return $ View String
148 all _ Int  = return $ View Int
149 all _ Float = return $ View Float
150 1 paulosilva all r (Prod a b) = do
151   View a' <- r a
152   View b' <- r b
153   return $ View (Prod a' b')
154 all r (Either a b) = do
155   View a' <- r a
156   View b' <- r b
157   return $ View (Either a' b')
158 all r (Maybe a) = do
159   View a' <- r a
160   return $ View (Maybe a')
161 all r (List a) = do
162   View a' <- r a
163   return $ View (List a')
164 all r (Set a) = do
165   View a' <- r a
166   return $ View (Set a')
167 all r (Map a b) = do
168   View a' <- r a
169   View b' <- r b
170   return $ View (Map a' b')
171 all r (Fun a b) = do
172   View a' <- r a
173   View b' <- r b
174   return $ View (Fun a' b')
175 all r (Rel a b) = do
176   View a' <- r a
177   View b' <- r b
178   return $ View (Rel a' b')
179 all r (Ord a) = do
180   View a' <- r a
181   return $ View (Ord a')
182 all r (GC a b) = do
183   View a' <- r a
184   View b' <- r b
185   return $ View (GC a' b')
186  
187 -------------------------------------------------------------------------------
188  
189 2 paulosilva one :: Rule -> Rule
190 one _ (TVar _) = mzero
191 one _ One = mzero
192 one _ Bool = mzero
193 one _ Char = mzero
194 one _ String = mzero
195 one _ Int = mzero
196 one _ Float = mzero
197 one r (Prod a b) =
198   (do View c <- r a
199       return $ View (Prod c b)) `morelse`
200   (do View c <- r b
201       return $ View (Prod a c))
202 one r (Either a b) =
203   (do View c <- r a
204       return $ View (Either c b)) `morelse`
205   (do View c <- r b
206       return $ View (Prod a c))
207 one r (Maybe a) =
208   (do View c <- r a
209       return $ View (Maybe c))
210 one r (List a) =
211   (do View c <- r a
212       return $ View (List c))
213 one r (Set a) =
214   (do View c <- r a
215       return $ View (Set c))
216 one r (Map a b) =
217   (do View c <- r a
218       return $ View (Map c b)) `morelse`
219   (do View c <- r b
220       return $ View (Map a c))
221 one r (Fun a b) =
222   (do View c <- r a
223       return $ View (Fun c b)) `morelse`
224   (do View c <- r b
225       return $ View (Fun a c))
226 one r (Rel a b) =
227   (do View c <- r a
228       return $ View (Rel c b)) `morelse`
229   (do View c <- r b
230       return $ View (Rel a c))
231 one r (Ord a) =
232   (do View c <- r a
233       return $ View (Ord c))
234 one r (GC a b) =
235   (do View c <- r a
236       return $ View (GC c b)) `morelse`
237   (do View c <- r b
238       return $ View (GC a c))
239  
240 -------------------------------------------------------------------------------
241  

Theme by Vikram Singh | Powered by WebSVN v2.3.3