Update LiftLambda to erase Zero args
This commit is contained in:
@@ -11,22 +11,22 @@ import Data.SnocList
|
||||
import Data.IORef
|
||||
import Monad.State
|
||||
|
||||
|
||||
ExpMap : U
|
||||
ExpMap = SortedMap QName CExp
|
||||
|
||||
liftLambdaTm : QName → SnocList Name → CExp → State ExpMap CExp
|
||||
liftLambdaTm : QName → SnocList (Quant × Name) → CExp → State ExpMap CExp
|
||||
-- CBnd
|
||||
liftLambdaTm name env (CFun nms t) = CFun nms <$> liftLambdaTm name (env <>< nms) t
|
||||
liftLambdaTm name env (CApp t u) =
|
||||
CApp <$> liftLambdaTm name env t <*> liftLambdaTm name env u
|
||||
liftLambdaTm name env (CLet nm v sc) = do
|
||||
v <- liftLambdaTm name env v
|
||||
sc <- liftLambdaTm name (env :< nm) sc
|
||||
sc <- liftLambdaTm name (env :< (Many, nm)) sc
|
||||
pure $ CLet nm v sc
|
||||
liftLambdaTm name env (CLetRec nm v sc) = do
|
||||
v <- liftLambdaTm name (env :< nm) v
|
||||
sc <- liftLambdaTm name (env :< nm) sc
|
||||
-- references should be removed by liftWhere
|
||||
v <- liftLambdaTm name (env :< (Zero, nm)) v
|
||||
sc <- liftLambdaTm name (env :< (Zero, nm)) sc
|
||||
pure $ CLetRec nm v sc
|
||||
|
||||
liftLambdaTm name env tm@(CCase t alts) = do
|
||||
@@ -39,14 +39,15 @@ liftLambdaTm name env tm@(CCase t alts) = do
|
||||
liftLambdaAlt (CDefAlt tm) = CDefAlt <$> liftLambdaTm name env tm
|
||||
liftLambdaAlt (CLitAlt l tm) = CLitAlt l <$> liftLambdaTm name env tm
|
||||
liftLambdaAlt (CConAlt ix nm info args tm) =
|
||||
CConAlt ix nm info args <$> liftLambdaTm name (env <>< args) tm
|
||||
CConAlt ix nm info args <$> liftLambdaTm name (env <>< map (_,_ Many) args) tm
|
||||
liftLambdaTm name@(QN ns nm) env tm@(CLam nm t) = do
|
||||
let (nms, t) = splitLam tm Lin
|
||||
t' <- liftLambdaTm name (env <>< nms) t
|
||||
let env' = env <>> nms
|
||||
-- TODO - maybe a better name here?
|
||||
qn <- getName name "lifted"
|
||||
modify $ updateMap qn (CFun (env <>> nms) t')
|
||||
pure $ CAppRef qn (makeApp (snoclen env)) (length' nms)
|
||||
modify $ updateMap qn (CFun env' t')
|
||||
pure $ CAppRef qn (makeApp (snoclen env)) (map fst env')
|
||||
where
|
||||
getName : QName → String → State ExpMap QName
|
||||
getName qn@(QN ns nm) ext = do
|
||||
@@ -55,8 +56,8 @@ liftLambdaTm name@(QN ns nm) env tm@(CLam nm t) = do
|
||||
let (Just _) = lookupMap qn' top | _ => pure qn'
|
||||
getName qn (ext ++ "'")
|
||||
|
||||
splitLam : CExp → SnocList Name → List Name × CExp
|
||||
splitLam (CLam nm t) acc = splitLam t (acc :< nm)
|
||||
splitLam : CExp → SnocList (Quant × Name) → List (Quant × Name) × CExp
|
||||
splitLam (CLam nm t) acc = splitLam t (acc :< (Many, nm))
|
||||
splitLam t acc = (acc <>> Nil, t)
|
||||
|
||||
wrapLam : Nat → CExp → CExp
|
||||
|
||||
Reference in New Issue
Block a user