diff options
Diffstat (limited to 'Unique.hs')
-rw-r--r-- | Unique.hs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Unique.hs b/Unique.hs new file mode 100644 index 0000000..13ae7cf --- /dev/null +++ b/Unique.hs | |||
@@ -0,0 +1,40 @@ | |||
1 | module Unique | ||
2 | ( UniqueFactory | ||
3 | , Unique | ||
4 | , uniqueSymbol | ||
5 | , substituteUnique | ||
6 | , multipleOccurances | ||
7 | ) where | ||
8 | |||
9 | import Data.Generics.Aliases | ||
10 | import Data.Generics.Schemes | ||
11 | import Language.Haskell.Exts.Syntax | ||
12 | |||
13 | newtype UniqueFactory = UniqueFactory Integer | ||
14 | |||
15 | newtype Unique = Unique Integer | ||
16 | deriving (Eq,Ord) | ||
17 | |||
18 | freshUniques :: UniqueFactory | ||
19 | freshUniques = UniqueFactory 0 | ||
20 | |||
21 | genUnique :: UniqueFactory -> (Unique,UniqueFactory) | ||
22 | genUnique (UniqueFactory c) = (Unique c, UniqueFactory (succ c)) | ||
23 | |||
24 | uniqueSymbol :: Unique -> Exp () | ||
25 | uniqueSymbol (Unique i) = Var () (UnQual () (Ident () (showSym i))) | ||
26 | |||
27 | showSym :: Integer -> String | ||
28 | showSym i = " u" ++ show i | ||
29 | |||
30 | substituteUnique :: Unique -> Exp () -> Exp () -> Exp () | ||
31 | substituteUnique u inner outer = everywhere (mkT $ subst inner) outer | ||
32 | where | ||
33 | subst x t | t == uniqueSymbol u = x | ||
34 | | otherwise = t | ||
35 | |||
36 | |||
37 | multipleOccurances :: Unique -> Exp () -> Bool | ||
38 | multipleOccurances u x = case listify (== uniqueSymbol u) x of | ||
39 | (x:y:ys) -> True | ||
40 | _ -> False | ||