@@ -25,7 +25,7 @@ import Data.Set qualified as Set
25
25
import Unison.ABT
26
26
( absChain' ,
27
27
renames ,
28
- visitPure ,
28
+ visit ,
29
29
pattern AbsN' ,
30
30
)
31
31
import Unison.Builtin.Decls (builtinDataDecls , builtinEffectDecls )
@@ -765,34 +765,41 @@ initialize ::
765
765
PType ->
766
766
Term v ->
767
767
[MatchCase () (Term v )] ->
768
- (Maybe v , (v , PType ), PatternMatrix v )
769
- initialize r sc cs =
770
- ( lv,
771
- (sv, r),
772
- PM $ evalState (traverse (mkRow sv) cs) 1
773
- )
768
+ State Word64 (Maybe v , (v , PType ), PatternMatrix v )
769
+ initialize r sc cs = do
770
+ (lv, sv) <- vars
771
+ rs <- traverse (mkRow sv) cs
772
+ pure (lv, (sv, r), PM rs)
774
773
where
775
- (lv, sv)
776
- | Var' v <- sc = (Nothing , v)
777
- | pv <- freshenId 0 $ typed Pattern =
778
- (Just pv, pv)
774
+ vars
775
+ | Var' v <- sc = pure (Nothing , v)
776
+ | otherwise = mkVars <$> grabId
777
+ mkVars n = (Just pv, pv)
778
+ where
779
+ pv = freshenId n $ typed Pattern
780
+
781
+ grabId :: State Word64 Word64
782
+ grabId = state $ \ n -> (n, n+ 1 )
779
783
780
784
splitPatterns :: (Var v ) => DataSpec -> Term v -> Term v
781
- splitPatterns spec0 = visitPure $ \ case
785
+ splitPatterns spec0 tm = evalState (splitPatterns0 spec tm) 0
786
+ where
787
+ spec = Map. insert Rf. booleanRef (Right [0 , 0 ]) spec0
788
+
789
+ splitPatterns0 :: (Var v ) => DataSpec -> Term v -> State Word64 (Term v )
790
+ splitPatterns0 spec = visit $ \ case
782
791
Match' sc0 cs0
783
- | ty <- determineType $ p <$> cs0,
784
- (lv, scrut, pm) <- initialize ty sc cs,
785
- body <- compile spec (uncurry Map. singleton scrut) pm ->
786
- Just $ case lv of
792
+ | ty <- determineType $ p <$> cs0 -> Just $ do
793
+ sc <- splitPatterns0 spec sc0
794
+ cs <- (traverse . traverse ) (splitPatterns0 spec) cs0
795
+ (lv, scrut, pm) <- initialize ty sc cs
796
+ let body = compile spec (uncurry Map. singleton scrut) pm
797
+ pure $ case lv of
787
798
Just v -> let1 False [((() , v), sc)] body
788
799
_ -> body
789
- where
790
- sc = splitPatterns spec sc0
791
- cs = fmap (splitPatterns spec) <$> cs0
792
800
_ -> Nothing
793
801
where
794
802
p (MatchCase pp _ _) = pp
795
- spec = Map. insert Rf. booleanRef (Right [0 , 0 ]) spec0
796
803
797
804
builtinCase :: Set Reference
798
805
builtinCase =
0 commit comments