@@ -1232,55 +1232,66 @@ findExtraDefaults fc defs (Case idx el ty altsIn)
12321232
12331233findExtraDefaults fc defs ctree = pure []
12341234
1235- mkSubst : {vars : _} -> (args : List Name ) ->
1235+ mkSubst : {vars : _} -> (args : List (Var vars) ) ->
12361236 (0 _ : LengthMatch args dropped) -> Subst Var dropped vars
12371237mkSubst [] NilMatch = []
1238- mkSubst (x :: xs) (ConsMatch m)
1239- = case isVar x vars of
1240- Just prf => prf :: mkSubst xs m
1241- Nothing => ? todo
1238+ mkSubst (x :: xs) (ConsMatch m) = x :: mkSubst xs m
12421239
1243- data MatchResult : Type where
1244- ConPat : Name -> (tag : Int) -> List Name -> MatchResult
1245- DelayPat : (ty, arg : Name ) -> MatchResult
1246- ConstPat : Constant -> MatchResult
1240+ data MatchResult : Scoped where
1241+ ConPat : Name -> (tag : Int) -> List (Var vars) -> MatchResult vars
1242+ DelayPat : (ty, arg : Var vars ) -> MatchResult vars
1243+ ConstPat : Constant -> MatchResult vars
12471244
1248- Show MatchResult where
1245+ Show ( MatchResult vars) where
12491246 show (ConPat n tag args) = " ConPat \{show n} \{show tag} \{show args}"
12501247 show (DelayPat ty arg) = " DelayPat \{show ty} \{show arg}"
12511248 show (ConstPat c) = " ConstPat \{show c}"
12521249
1253- optimiseTree : {vars : _} -> List (Name, MatchResult) -> CaseTree vars -> CaseTree vars
1254-
1255- optimiseAlt : {vars : _} -> List (Name, MatchResult) -> Name -> CaseAlt vars -> CaseAlt vars
1256- optimiseAlt ps nm (ConCase n tag args sc)
1257- = ConCase n tag args (optimiseTree ((nm, ConPat n tag args) :: ps) sc)
1258- optimiseAlt ps nm (DelayCase ty arg sc)
1259- = DelayCase ty arg (optimiseTree ((nm, DelayPat ty arg) :: ps) sc)
1260- optimiseAlt ps nm (ConstCase c sc)
1261- = ConstCase c (optimiseTree ((nm, ConstPat c) :: ps) sc)
1262- optimiseAlt ps nm (DefaultCase sc) = DefaultCase (optimiseTree ps sc)
1263-
1264- pickAlt : {vars : _} -> List (Name, MatchResult) -> MatchResult -> List (CaseAlt vars) -> Maybe (CaseTree vars)
1250+ Weaken MatchResult where
1251+ weakenNs s (ConPat n tag args) = ConPat n tag (weakenNs s <$> args)
1252+ weakenNs s (DelayPat ty arg) = DelayPat (weakenNs s ty) (weakenNs s arg)
1253+ weakenNs s (ConstPat c) = ConstPat c
1254+
1255+ optimiseTree : {vars : _} -> List (Var vars, MatchResult vars) -> CaseTree vars -> CaseTree vars
1256+
1257+ optimiseAlt : {vars : _} -> List (Var vars, MatchResult vars) -> Var vars -> CaseAlt vars -> CaseAlt vars
1258+ optimiseAlt ps v (ConCase n tag args sc)
1259+ = do let sz = mkSizeOf args
1260+ let v' = weakenNs sz v
1261+ let ps' = map (bimap (weakenNs sz) (weakenNs sz)) ps
1262+ let args' = allVarsPrefix sz
1263+ ConCase n tag args (optimiseTree ((v', ConPat n tag args') :: ps') sc)
1264+ optimiseAlt ps v (DelayCase ty arg sc)
1265+ = do let sz = mkSizeOf [_ , _ ]
1266+ let v' = weakenNs sz v
1267+ let ps' = map (bimap (weakenNs sz) (weakenNs sz)) ps
1268+ DelayCase ty arg (optimiseTree ((v', DelayPat first (later first)) :: ps') sc)
1269+ optimiseAlt ps v (ConstCase c sc)
1270+ = ConstCase c (optimiseTree ((v, ConstPat c) :: ps) sc)
1271+ optimiseAlt ps v (DefaultCase sc) = DefaultCase (optimiseTree ps sc)
1272+
1273+ pickAlt : {vars : _} -> List (Var vars, MatchResult vars) ->
1274+ MatchResult vars -> List (CaseAlt vars) -> Maybe (CaseTree vars)
12651275pickAlt _ _ [] = Nothing
12661276pickAlt ps p@(ConPat n t args) (ConCase n' t' args' sc :: alts)
12671277 = if t == t' && n == n'
12681278 then checkLengthMatch args args' <&> \ match => -- lengths should always match
12691279 optimiseTree ps $ substCaseTree zero (mkSizeOf _ ) (mkSubst args match) sc
12701280 else pickAlt ps p alts
12711281pickAlt ps (DelayPat ty arg) (DelayCase ty' arg' sc :: alts)
1272- = Just $ optimiseTree ps $ substCaseTree zero (mkSizeOf _ ) (mkSubst {dropped= [_ , _ ]} [ty, arg] % search) sc
1282+ = do let subst : Subst Var [ty', arg'] vars = mkSubst [ty, arg] %search
1283+ Just (optimiseTree ps $ substCaseTree zero (mkSizeOf _ ) subst sc)
12731284pickAlt ps p@(ConstPat c) (ConstCase c' sc :: alts)
12741285 = if c == c'
1275- then Just $ optimiseTree ps sc
1286+ then Just ( optimiseTree ps sc)
12761287 else pickAlt ps p alts
1277- pickAlt ps _ (DefaultCase sc :: alts) = Just $ optimiseTree ps sc
1288+ pickAlt ps _ (DefaultCase sc :: alts) = Just ( optimiseTree ps sc)
12781289pickAlt ps p (_ :: alts) = pickAlt ps p alts
12791290
12801291optimiseTree ps (Case idx el ty alts)
1281- = do let name = nameAt el
1282- fromMaybe (Case idx el ty (map (optimiseAlt ps name ) alts)) $ do
1283- p <- lookup name ps
1292+ = do let var = MkVar el
1293+ fromMaybe (Case idx el ty (map (optimiseAlt ps var ) alts)) $ do
1294+ p <- lookup var ps
12841295 pickAlt ps p alts
12851296optimiseTree _ tm = tm
12861297
0 commit comments