aboutsummaryrefslogtreecommitdiff
path: root/snug-clean/src/Snug/Syntax.icl
diff options
context:
space:
mode:
Diffstat (limited to 'snug-clean/src/Snug/Syntax.icl')
-rw-r--r--snug-clean/src/Snug/Syntax.icl34
1 files changed, 34 insertions, 0 deletions
diff --git a/snug-clean/src/Snug/Syntax.icl b/snug-clean/src/Snug/Syntax.icl
index f886750..839e067 100644
--- a/snug-clean/src/Snug/Syntax.icl
+++ b/snug-clean/src/Snug/Syntax.icl
@@ -1 +1,35 @@
implementation module Snug.Syntax
+
+import qualified Data.Set
+from Data.Set import :: Set
+import StdEnv
+
+none = 'Data.Set'.newSet
+
+instance usedSymbols [a] | usedSymbols a
+where
+ usedSymbols xs = 'Data.Set'.unions (map usedSymbols xs)
+
+instance usedSymbols (a, b) | usedSymbols a & usedSymbols b
+where
+ usedSymbols (x,y) = 'Data.Set'.union (usedSymbols x) (usedSymbols y)
+
+instance usedSymbols CaseAlternative
+where
+ usedSymbols (CaseAlternative pat expr) =
+ 'Data.Set'.difference (usedSymbols expr) (usedSymbols pat)
+
+instance usedSymbols Expression
+where
+ usedSymbols (BasicValue _) = none
+ usedSymbols (Symbol sym) = none
+ usedSymbols (Constructor _) = none
+ usedSymbols (Case e alts) = usedSymbols (e, alts)
+ usedSymbols (ExpApp e1 e2) = usedSymbols (e1, e2)
+
+instance usedSymbols Pattern
+where
+ usedSymbols Wildcard = none
+ usedSymbols (BasicValuePattern _) = none
+ usedSymbols (IdentPattern id) = 'Data.Set'.singleton id
+ usedSymbols (ConstructorPattern _ syms) = 'Data.Set'.fromList syms