@@ -28,7 +28,7 @@ import Control.Applicative
28import Control.Monad.State
28import Control.Monad.State
29import Data.Maybe (fromMaybe)
29import Data.Maybe (fromMaybe)
31−type MemberMap = M.Map (ModuleName, ProperName) [(String, Type)]
31+type MemberMap = M.Map (ModuleName, ProperName) (String, [(String, Type)])
33desugarTypeClasses :: [Module] -> [Module]
33desugarTypeClasses :: [Module] -> [Module]
34desugarTypeClasses = flip evalState M.empty . mapM desugarModule
34desugarTypeClasses = flip evalState M.empty . mapM desugarModule
@@ -39,7 +39,7 @@ desugarModule (Module name decls) = Module name <$> concat <$> mapM (desugarDecl
39desugarDecl :: ModuleName -> Declaration -> State MemberMap [Declaration]
39desugarDecl :: ModuleName -> Declaration -> State MemberMap [Declaration]
40desugarDecl mn (TypeClassDeclaration name arg members) = do
40desugarDecl mn (TypeClassDeclaration name arg members) = do
41 let tys = map memberToNameAndType members
41 let tys = map memberToNameAndType members
42− modify (M.insert (mn, name) tys)
42+ modify (M.insert (mn, name) (arg, tys))
43 return $ typeClassDictionaryDeclaration name arg members : map (typeClassMemberToDictionaryAccessor name arg) members
43 return $ typeClassDictionaryDeclaration name arg members : map (typeClassMemberToDictionaryAccessor name arg) members
44desugarDecl mn (TypeInstanceDeclaration deps name ty members) = do
44desugarDecl mn (TypeInstanceDeclaration deps name ty members) = do
45 entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) members
45 entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) members
@@ -57,29 +57,34 @@ typeClassDictionaryDeclaration name arg members =
57typeClassMemberToDictionaryAccessor :: ProperName -> String -> Declaration -> Declaration
57typeClassMemberToDictionaryAccessor :: ProperName -> String -> Declaration -> Declaration
58typeClassMemberToDictionaryAccessor name arg (TypeDeclaration ident ty) =
58typeClassMemberToDictionaryAccessor name arg (TypeDeclaration ident ty) =
59 ExternDeclaration ident
59 ExternDeclaration ident
60− (Just (JSFunction (Just (Ident arg)) [Ident "dict"] (JSReturn (JSAccessor arg (JSVar (Ident "dict"))))))
60+ (Just (JSFunction (Just ident) [Ident "dict"] (JSBlock [JSReturn (JSAccessor arg (JSVar (Ident "dict")))])))
61 (ForAll arg (ConstrainedType [(Qualified Nothing name, TypeVar arg)] ty))
61 (ForAll arg (ConstrainedType [(Qualified Nothing name, TypeVar arg)] ty))
62typeClassMemberToDictionaryAccessor _ _ _ = error "Invalid declaration in type class definition"
62typeClassMemberToDictionaryAccessor _ _ _ = error "Invalid declaration in type class definition"
64typeInstanceDictionaryDeclaration :: [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> [Declaration] -> Declaration
64typeInstanceDictionaryDeclaration :: [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> [Declaration] -> Declaration
65typeInstanceDictionaryDeclaration deps name ty decls =
65typeInstanceDictionaryDeclaration deps name ty decls =
66 ExternDeclaration (mkDictionaryValueName name ty)
66 ExternDeclaration (mkDictionaryValueName name ty)
67+ (Just (JSFunction (Just (mkDictionaryValueName name ty))
68+ (map (\n -> Ident ('_' : show n)) [1..length deps])
67− (Just (JSObjectLiteral $ map memberToNameAndValue decls))
69+ (JSBlock [JSReturn (JSObjectLiteral $ map memberToNameAndValue decls)])))
68 (Function (map (\(pn, ty') -> TypeApp (TypeConstructor pn) ty') deps) (TypeApp (TypeConstructor name) ty))
70 (Function (map (\(pn, ty') -> TypeApp (TypeConstructor pn) ty') deps) (TypeApp (TypeConstructor name) ty))
70 memberToNameAndValue :: Declaration -> (String, JS)
72 memberToNameAndValue :: Declaration -> (String, JS)
71 memberToNameAndValue (ValueDeclaration ident _ _ _) =
73 memberToNameAndValue (ValueDeclaration ident _ _ _) =
72− (identToString ident, JSVar $ mkDictionaryEntryName name ty ident)
74+ (identToString ident, let dict = JSVar $ mkDictionaryEntryName name ty ident
75+ in if null deps then dict
76+ else JSApp dict (map (\n -> JSVar (Ident ('_' : show n))) [1..length deps]))
73 memberToNameAndValue _ = error "Invalid declaration in type instance definition"
77 memberToNameAndValue _ = error "Invalid declaration in type instance definition"
75typeInstanceDictionaryEntryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> Declaration -> State MemberMap Declaration
79typeInstanceDictionaryEntryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> Declaration -> State MemberMap Declaration
76typeInstanceDictionaryEntryDeclaration mn deps name ty (ValueDeclaration ident binders grd val) = do
80typeInstanceDictionaryEntryDeclaration mn deps name ty (ValueDeclaration ident binders grd val) = do
78− let valTy = fromMaybe (error "Type class instance dictionary member is missing in typeInstanceDictionaryEntryDeclaration") $ do
82+ let valTy = fromMaybe (error "Type class instance dictionary member is missing in typeInstanceDictionaryEntryDeclaration") $
79− members <- M.lookup (qualify mn name) m
83+ do (arg, members) <- M.lookup (qualify mn name) m
80− lookup (identToString ident) members
84+ ty' <- lookup (identToString ident) members
85+ return $ replaceTypeVars arg ty ty'
81 return $ ValueDeclaration (mkDictionaryEntryName name ty ident) binders grd
86 return $ ValueDeclaration (mkDictionaryEntryName name ty ident) binders grd
82− (TypedValue val (ConstrainedType deps valTy))
87+ (TypedValue val (if null deps then valTy else ConstrainedType deps valTy))
83typeInstanceDictionaryEntryDeclaration _ _ _ _ _ = error "Invalid declaration in type instance definition"
88typeInstanceDictionaryEntryDeclaration _ _ _ _ _ = error "Invalid declaration in type instance definition"
85identToString :: Ident -> String
90identToString :: Ident -> String