0 | module Language.Reflection.VarSubst
2 | import Data.SortedSet
3 | import Data.SortedMap
5 | import Language.Reflection
6 | import Language.Reflection.TTImp
7 | import Language.Reflection.TT
8 | import Language.Reflection.Util
9 | import Control.Monad.Identity
10 | import Control.Monad.Reader
11 | import Control.Monad.Reader.Tuple
12 | import Control.Monad.State
17 | TTOp : (Type -> Type) -> Type
18 | TTOp m = TTImp -> m TTImp -> m TTImp
23 | NameSet = SortedSet Name
26 | insertM : Maybe Name -> NameSet -> NameSet
27 | insertM Nothing = id
28 | insertM (Just x) = insert x
31 | record ShadowingInfo where
34 | shadowedNames : NameSet
37 | isShadowed : Name -> ShadowingInfo -> Bool
38 | isShadowed n = contains n . shadowedNames
40 | parameters {auto _ : MonadReader ShadowingInfo m}
44 | doPiInfo : PiInfo TTImp -> m $
PiInfo TTImp
45 | doPiInfo (DefImplicit x) = DefImplicit <$> doTTImp x
49 | doTTImp : TTImp -> m TTImp
50 | doTTImp = assert_total mapATTImp' provideSI
54 | provideSI b@(IPi fc count pinfo mn argTy lamTy) newM = do
55 | pinfo <- doPiInfo pinfo
56 | argTy <- doTTImp argTy
57 | lamTy <- local {shadowedNames $= insertM mn} $
doTTImp lamTy
58 | f b $
pure $
IPi fc count pinfo mn argTy lamTy
59 | provideSI b@(ILam fc count pinfo mn argTy lamTy) newM = do
60 | pinfo <- doPiInfo pinfo
61 | argTy <- doTTImp argTy
62 | lamTy <- local {shadowedNames $= insertM mn} $
doTTImp lamTy
63 | f b $
pure $
ILam fc count pinfo mn argTy lamTy
64 | provideSI b@(ILet fc lhsFC c n nTy nVal scope) newM = do
66 | nVal <- doTTImp nVal
67 | scope <- local {shadowedNames $= insert n} $
doTTImp scope
68 | f b $
pure $
ILet fc lhsFC c n nTy nVal scope
69 | provideSI b newM = do
73 | record QuoteInfo where
79 | provideQI : MonadReader QuoteInfo m =>
82 | provideQI f b@(IQuote fc t) newM = f b $
local {isQuote := True} newM
83 | provideQI f b@(IQuoteDecl fc decls) newM = f b $
local {isQuote := True} newM
84 | provideQI f b@(IUnquote fc t) newM = f b $
local {isQuote := False} newM
85 | provideQI f b newM = f b newM
88 | provideCtx : Monad m =>
89 | MonadReader QuoteInfo m =>
90 | MonadReader ShadowingInfo m =>
92 | provideCtx = provideSI . provideQI
95 | mapTTOp : Monad m => TTOp (ReaderT (ShadowingInfo, QuoteInfo) m) -> TTImp -> m TTImp
97 | let readerOp = mapATTImp' . provideCtx $
op
98 | runReaderT (MkSI empty, MkQI False) $
readerOp t
100 | containsVariableImpl : Monad m =>
101 | MonadReader QuoteInfo m =>
102 | MonadReader ShadowingInfo m =>
103 | MonadState Bool m =>
105 | containsVariableImpl n (IVar _ n') m =
107 | && not !(asks isQuote)
108 | && not !(asks $
isShadowed n)
111 | containsVariableImpl n tt m = m
115 | containsVariable : Name -> TTImp -> Bool
116 | containsVariable n =
118 | mapTTOp (containsVariableImpl n)
120 | collectVariablesImpl : Monad m =>
121 | MonadReader QuoteInfo m =>
122 | MonadReader ShadowingInfo m =>
123 | MonadState NameSet m =>
125 | collectVariablesImpl (IVar _ n) m = do
126 | if not !(asks isQuote)
127 | && not !(asks $
isShadowed n)
128 | then modify (insert n) *> m
130 | collectVariablesImpl tt m = m
134 | usesVariables : TTImp -> NameSet
137 | mapTTOp (collectVariablesImpl)
139 | substituteVariablesImpl : Monad m =>
140 | MonadReader QuoteInfo m =>
141 | MonadReader ShadowingInfo m =>
142 | SortedMap Name TTImp -> TTOp m
143 | substituteVariablesImpl vMap (IVar fc n) m =
144 | if not !(asks isQuote)
145 | && not !(asks $
isShadowed n)
147 | fromMaybe m $
pure <$> lookup n vMap
149 | substituteVariablesImpl _ _ m = m
153 | substituteVariables : SortedMap Name TTImp -> TTImp -> TTImp
154 | substituteVariables vMap =
156 | mapTTOp (substituteVariablesImpl vMap)
160 | substituteVariable : Name -> TTImp -> TTImp -> TTImp
161 | substituteVariable n t =
163 | mapTTOp (substituteVariablesImpl $
insert n t empty)
166 | substituteBindImpl : Monad m =>
167 | MonadReader QuoteInfo m =>
168 | MonadReader ShadowingInfo m =>
169 | SortedMap Name TTImp -> TTOp m
170 | substituteBindImpl vMap (IVar fc n) m =
171 | if not !(asks isQuote)
172 | && not !(asks $
isShadowed n)
174 | fromMaybe m $
pure <$> lookup n vMap
176 | substituteBindImpl vMap (IBindVar fc n) m =
177 | if not !(asks isQuote)
178 | && not !(asks $
isShadowed n)
180 | fromMaybe m $
pure <$> lookup n vMap
182 | substituteBindImpl _ _ m = m
186 | substituteBind : SortedMap Name TTImp -> TTImp -> TTImp
187 | substituteBind vMap = do
188 | runIdentity . mapTTOp (substituteBindImpl vMap)