@@ -12,15 +12,16 @@ module LambdaBuffers.Compiler.TypeClass.Compat (
1212
1313import Control.Lens ((^.) )
1414import Control.Lens.Combinators (view )
15- import Data.List.NonEmpty ( NonEmpty ( (:|) ) )
15+ import Data.Bifunctor ( second )
1616import Data.List.NonEmpty qualified as NE
17+ import Data.Map qualified as M
1718import Data.Text qualified as T
1819import LambdaBuffers.Compiler.ProtoCompat qualified as P
1920import LambdaBuffers.Compiler.TypeClass.Pat (
2021 Exp (AppE , DecE , LitE , NilE , RefE ),
2122 ExpressionLike (nil , (*:) , (*=) ),
2223 Literal (ModuleName , Name , Opaque , TyVar ),
23- Pat (AppP , DecP , LitP , NilP , RefP , VarP ),
24+ Pat (AppP , DecP , LitP , NilP , RefP ),
2425 toProdE ,
2526 toProdP ,
2627 toRecE ,
@@ -48,20 +49,20 @@ making the resulting Pat suitable for substitution into Rules.
4849-}
4950defToExp :: P. TyDef -> Exp
5051defToExp (P. TyDef tName (P. TyAbs tArgs tBody _) _) = DecE (LitE . Name $ tName ^. # name) vars $ case tBody of
51- P. SumI constrs -> toSumE . NE. toList . fmap goConstr $ (constrs ^. # constructors)
52+ P. SumI constrs -> toSumE . fmap ( uncurry goConstr . second (view # product )) . M. toList $ (constrs ^. # constructors)
5253 P. OpaqueI _ -> LitE Opaque
5354 where
54- collectFreeTyVars :: [P. TyArg ] -> Exp
55- collectFreeTyVars = foldr (\ x acc -> LitE (TyVar (x ^. ( # argName . # name) )) *: acc) nil
55+ collectFreeTyVars :: [P. VarName ] -> Exp
56+ collectFreeTyVars = foldr (\ x acc -> LitE (TyVar (x ^. # name)) *: acc) nil
5657
57- vars = collectFreeTyVars tArgs
58+ vars = collectFreeTyVars ( M. keys tArgs)
5859
59- goConstr :: P. Constructor -> Exp
60- goConstr (P. Constructor n p) = LitE (Name (n ^. # name) ) *= goProduct p
60+ goConstr :: P. ConstrName -> P. Product -> Exp
61+ goConstr (P. ConstrName n _) p = LitE (Name n ) *= goProduct p
6162
6263 goProduct :: P. Product -> Exp
6364 goProduct = \ case
64- P. RecordI (P. Record rMap _) -> toRecE . NE. toList . fmap goField $ rMap
65+ P. RecordI (P. Record rMap _) -> toRecE . fmap goField . M. elems $ rMap
6566 P. TupleI (P. Tuple pList _) -> toProdE $ fmap tyToExp pList
6667
6768 goField :: P. Field -> Exp
@@ -80,35 +81,36 @@ tyToExp = \case
8081 let mnm = modulename mn
8182 in RefE (LitE $ ModuleName mnm) . LitE . Name $ (tn ^. # name)
8283
83- appToExp :: Exp -> NonEmpty Exp -> Exp
84- appToExp fun (p :| ps) = case NE. nonEmpty ps of
84+ appToExp :: Exp -> [Exp ] -> Exp
85+ appToExp e [] = e
86+ appToExp fun (p : ps) = case NE. nonEmpty ps of
8587 Nothing -> AppE fun p
86- Just rest -> AppE fun p `appToExp` rest
88+ Just rest -> AppE fun p `appToExp` NE. toList rest
8789
8890defToPat :: P. TyDef -> Pat
8991defToPat (P. TyDef tName (P. TyAbs tArgs tBody _) _) = DecP (LitP . Name $ tName ^. # name) vars $ case tBody of
90- P. SumI constrs -> toSumP . NE. toList . fmap goConstr $ (constrs ^. # constructors)
92+ P. SumI constrs -> toSumP . fmap ( uncurry goConstr . second (view # product )) . M. toList $ (constrs ^. # constructors)
9193 P. OpaqueI _ -> LitP Opaque
9294 where
93- collectFreeTyVars :: [P. TyArg ] -> Pat
94- collectFreeTyVars = foldr (\ x acc -> VarP (x ^. ( # argName . # name)) *: acc) nil
95+ collectFreeTyVars :: [P. VarName ] -> Pat
96+ collectFreeTyVars = foldr (\ x acc -> LitP ( TyVar (x ^ . # name)) *: acc) nil
9597
96- vars = collectFreeTyVars tArgs
98+ vars = collectFreeTyVars ( M. keys tArgs)
9799
98- goConstr :: P. Constructor -> Pat
99- goConstr (P. Constructor n p) = LitP (Name (n ^. # name) ) *= goProduct p
100+ goConstr :: P. ConstrName -> P. Product -> Pat
101+ goConstr (P. ConstrName n _) p = LitP (Name n ) *= goProduct p
100102
101103 goProduct :: P. Product -> Pat
102104 goProduct = \ case
103- P. RecordI (P. Record rMap _) -> toRecP . NE. toList . fmap goField $ rMap
105+ P. RecordI (P. Record rMap _) -> toRecP . fmap goField . M. elems $ rMap
104106 P. TupleI (P. Tuple pList _) -> toProdP $ fmap tyToPat pList
105107
106108 goField :: P. Field -> Pat
107109 goField (P. Field n v) = LitP (Name (n ^. # name)) *= tyToPat v
108110
109111tyToPat :: P. Ty -> Pat
110112tyToPat = \ case
111- P. TyVarI t -> VarP ( t ^. # varName . # name)
113+ P. TyVarI t -> LitP . TyVar $ t ^. # varName . # name
112114 P. TyAppI tapp ->
113115 let fun = tyToPat $ tapp ^. # tyFunc
114116 ps = tyToPat <$> tapp ^. # tyArgs
@@ -119,7 +121,8 @@ tyToPat = \case
119121 let mnm = modulename mn
120122 in RefP (LitP $ ModuleName mnm) . LitP . Name $ (tn ^. # name)
121123
122- appToPat :: Pat -> NonEmpty Pat -> Pat
123- appToPat fun (p :| ps) = case NE. nonEmpty ps of
124+ appToPat :: Pat -> [Pat ] -> Pat
125+ appToPat e [] = e
126+ appToPat fun (p : ps) = case NE. nonEmpty ps of
124127 Nothing -> AppP fun p
125- Just rest -> AppP fun p `appToPat` rest
128+ Just rest -> AppP fun p `appToPat` NE. toList rest
0 commit comments