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