Subversion

Galculator

[/] [src/] [Language/] [Law/] [Refresh.hs] -

Blame information for rev 1

Line No. Rev Author Line
1 1 paulosilva  
2 1 paulosilva {-# LANGUAGE FlexibleContexts #-}
3 1 paulosilva {-# OPTIONS_GHC -Wall #-}
4 1 paulosilva  
5 1 paulosilva -------------------------------------------------------------------------------
6 1 paulosilva
7 1 paulosilva {- |
8 1 paulosilva Module : Language.Law.Refresh
9 1 paulosilva Description : Operations for refreshing the variable names.
10 1 paulosilva Copyright : (c) Paulo Silva
11 1 paulosilva License : LGPL
12 1 paulosilva  
13 1 paulosilva Maintainer : paufil@di.uminho.pt
14 1 paulosilva Stability : experimental
15 1 paulosilva Portability : portable
16 1 paulosilva  
17 1 paulosilva -}
18 1 paulosilva  
19 1 paulosilva -------------------------------------------------------------------------------
20 1 paulosilva
21 1 paulosilva module Language.Law.Refresh (
22 1 paulosilva   refresh
23 1 paulosilva  ) where
24 1 paulosilva  
25 1 paulosilva import Control.Monad.Fresh
26 1 paulosilva import Control.Monad.Reader
27 1 paulosilva import Data.List
28 1 paulosilva import Language.Law.SyntaxADT
29 1 paulosilva import qualified Language.R.Refresh as R
30 1 paulosilva import Language.R.SyntaxADT
31 1 paulosilva  
32 1 paulosilva -------------------------------------------------------------------------------
33 1 paulosilva
34 1 paulosilva refresh :: MonadFresh [String] String m => LawS -> m LawS
35 1 paulosilva refresh (EquivS p n s1 s2) = aux (EquivS p n) s1 s2
36 1 paulosilva refresh (ImplS p n s1 s2) = aux (ImplS p n) s1 s2
37 1 paulosilva  
38 1 paulosilva -------------------------------------------------------------------------------
39 1 paulosilva
40 1 paulosilva aux :: MonadFresh [String] String m => (S -> S -> LawS) -> S -> S -> m LawS
41 1 paulosilva aux constr s1 s2 = let
42 1 paulosilva     (rvar1,tvar1) = R.collect s1
43 1 paulosilva     (rvar2,tvar2) = R.collect s2
44 1 paulosilva     rvar = nub $ rvar1 ++ rvar2
45 1 paulosilva     tvar = nub $ tvar1 ++ tvar2
46 1 paulosilva   in do
47 1 paulosilva     newVars <- R.refreshVar rvar
48 1 paulosilva     newTypes <- R.refreshType tvar
49 1 paulosilva     let s1' = runReader (R.replace s1) $ R.St {R.rvars = newVars,
50 1 paulosilva                                                R.tvars = newTypes}
51 1 paulosilva         s2' = runReader (R.replace s2) $ R.St {R.rvars = newVars,
52 1 paulosilva                                                R.tvars = newTypes}
53 1 paulosilva     return $ constr s1' s2'
54 1 paulosilva  
55 1 paulosilva -------------------------------------------------------------------------------
56 1 paulosilva

Theme by Vikram Singh | Powered by WebSVN v1.61