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