packages feed

ddc-source-tetra-0.4.3.1: DDC/Source/Tetra/Collect/FreeVars.hs

module DDC.Source.Tetra.Collect.FreeVars where
import DDC.Source.Tetra.Exp
import DDC.Source.Tetra.Env             (Env, Presence(..))
import Data.Set                         (Set)
import qualified DDC.Source.Tetra.Env   as Env
import qualified Data.Set               as Set


-- | Collect the variables a type that do not appear in the given environment.
freeVarsT :: Env -> Type -> Set Bound
freeVarsT env tt
 = case tt of
        TAnnot _ t
         -> freeVarsT env t

        TCon{}
         -> Set.empty

        TVar u@(UName _)
         -> case Env.lookupTyVar env u of
                Present _ -> Set.empty
                Unknown   -> Set.empty
                Absent    -> Set.singleton u

        TVar u@(UIx i)
         -> case Env.lookupTyVar env u of
                Present _ -> Set.empty
                Unknown   -> Set.empty
                Absent    -> Set.singleton (UIx (i - Env.tyStackDepth env))

        TVar UHole
         -> Set.empty

        TAbs{}
         |  Just (k, b, t)       <- takeTForall tt
         -> freeVarsT (Env.extendTyVar b k env) t

         |  otherwise
         -> Set.empty

        TApp t1 t2
         -> Set.union (freeVarsT env t1) (freeVarsT env t2)