@@ -13,7 +13,9 @@
13-----------------------------------------------------------------------------
13-----------------------------------------------------------------------------
15module Language.PureScript.Sugar.TypeClasses (
15module Language.PureScript.Sugar.TypeClasses (
16− desugarTypeClasses
16+ desugarTypeClasses,
17+ mkDictionaryValueName,
18+ mkDictionaryEntryName
19import Language.PureScript.Declarations
21import Language.PureScript.Declarations
@@ -47,8 +49,9 @@ desugarDecl mn d@(TypeClassDeclaration name arg members) = do
47 modify (M.insert (mn, name) (arg, tys))
49 modify (M.insert (mn, name) (arg, tys))
48 return $ d : typeClassDictionaryDeclaration name arg members : map (typeClassMemberToDictionaryAccessor name arg) members
50 return $ d : typeClassDictionaryDeclaration name arg members : map (typeClassMemberToDictionaryAccessor name arg) members
49desugarDecl mn d@(TypeInstanceDeclaration deps name ty members) = do
51desugarDecl mn d@(TypeInstanceDeclaration deps name ty members) = do
52+ desugared <- lift $ desugarCases members
50− entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) members
53+ entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) desugared
51− dictDecl <- typeInstanceDictionaryDeclaration mn deps name ty members
54+ dictDecl <- typeInstanceDictionaryDeclaration mn deps name ty desugared
52 return $ d : dictDecl : entries
55 return $ d : dictDecl : entries
53desugarDecl _ other = return [other]
56desugarDecl _ other = return [other]
@@ -69,7 +72,7 @@ typeClassMemberToDictionaryAccessor _ _ _ = error "Invalid declaration in type c
70typeInstanceDictionaryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> [Declaration] -> Desugar Declaration
73typeInstanceDictionaryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> [Declaration] -> Desugar Declaration
71typeInstanceDictionaryDeclaration mn deps name ty decls = do
74typeInstanceDictionaryDeclaration mn deps name ty decls = do
72− entryName <- mkDictionaryValueName mn name ty
75+ entryName <- lift $ mkDictionaryValueName mn name ty
73 memberNames <- mapM memberToNameAndValue decls
76 memberNames <- mapM memberToNameAndValue decls
74 return $ ExternDeclaration entryName
77 return $ ExternDeclaration entryName
75 (Just (JSFunction (Just entryName)
78 (Just (JSFunction (Just entryName)
@@ -84,16 +87,15 @@ typeInstanceDictionaryDeclaration mn deps name ty decls = do
84 memberToNameAndValue _ = error "Invalid declaration in type instance definition"
87 memberToNameAndValue _ = error "Invalid declaration in type instance definition"
86typeInstanceDictionaryEntryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> Declaration -> Desugar Declaration
89typeInstanceDictionaryEntryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> Declaration -> Desugar Declaration
87−typeInstanceDictionaryEntryDeclaration mn deps name ty (ValueDeclaration ident binders grd val) = do
90+typeInstanceDictionaryEntryDeclaration mn deps name ty (ValueDeclaration ident [] _ val) = do
89 let valTy = fromMaybe (error "Type class instance dictionary member is missing in typeInstanceDictionaryEntryDeclaration") $
92 let valTy = fromMaybe (error "Type class instance dictionary member is missing in typeInstanceDictionaryEntryDeclaration") $
90 do (arg, members) <- M.lookup (qualify mn name) m
93 do (arg, members) <- M.lookup (qualify mn name) m
91 ty' <- lookup (identToString ident) members
94 ty' <- lookup (identToString ident) members
92 return $ replaceTypeVars arg ty ty'
95 return $ replaceTypeVars arg ty ty'
93 entryName <- mkDictionaryEntryName mn name ty ident
96 entryName <- mkDictionaryEntryName mn name ty ident
94− [ValueDeclaration _ _ _ val'] <- lift $ desugarCases [ValueDeclaration entryName binders grd val]
95 return $ ValueDeclaration entryName [] Nothing
97 return $ ValueDeclaration entryName [] Nothing
96− (TypedValue val' (quantify (if null deps then valTy else ConstrainedType deps valTy)))
98+ (TypedValue val (quantify (if null deps then valTy else ConstrainedType deps valTy)))
97typeInstanceDictionaryEntryDeclaration _ _ _ _ _ = error "Invalid declaration in type instance definition"
99typeInstanceDictionaryEntryDeclaration _ _ _ _ _ = error "Invalid declaration in type instance definition"
99identToString :: Ident -> String
101identToString :: Ident -> String
@@ -111,21 +113,21 @@ quantify ty' = foldr ForAll ty' tyVars
111 collect (TypeVar v) = [v]
113 collect (TypeVar v) = [v]
112 collect _ = []
114 collect _ = []
114−mkDictionaryValueName :: ModuleName -> Qualified ProperName -> Type -> Desugar Ident
116+mkDictionaryValueName :: ModuleName -> Qualified ProperName -> Type -> Either String Ident
115mkDictionaryValueName mn cl ty = do
117mkDictionaryValueName mn cl ty = do
116− tyStr <- lift $ typeToString ty
118+ tyStr <- typeToString mn ty
117 return $ Ident $ "__" ++ qualifiedToString mn cl ++ "_" ++ tyStr
119 return $ Ident $ "__" ++ qualifiedToString mn cl ++ "_" ++ tyStr
119− typeToString :: Type -> Either String String
121+typeToString :: ModuleName -> Type -> Either String String
120− typeToString String = return "string"
122+typeToString _ String = return "string"
121− typeToString Number = return "number"
123+typeToString _ Number = return "number"
122− typeToString Boolean = return "boolean"
124+typeToString _ Boolean = return "boolean"
123− typeToString (Array (TypeVar _)) = return "array"
125+typeToString _ (Array (TypeVar _)) = return "array"
124− typeToString (TypeConstructor ty') = return $ qualifiedToString mn ty'
126+typeToString mn (TypeConstructor ty') = return $ qualifiedToString mn ty'
125− typeToString (TypeApp ty' (TypeVar _)) = typeToString ty'
127+typeToString mn (TypeApp ty' (TypeVar _)) = typeToString mn ty'
126− typeToString _ = Left "Type class instance must be of the form T a1 ... an"
128+typeToString _ _ = Left "Type class instance must be of the form T a1 ... an"
128mkDictionaryEntryName :: ModuleName -> Qualified ProperName -> Type -> Ident -> Desugar Ident
130mkDictionaryEntryName :: ModuleName -> Qualified ProperName -> Type -> Ident -> Desugar Ident
129mkDictionaryEntryName mn name ty ident = do
131mkDictionaryEntryName mn name ty ident = do
130− Ident dictName <- mkDictionaryValueName mn name ty
132+ Ident dictName <- lift $ mkDictionaryValueName mn name ty
131 return $ Ident $ dictName ++ "_" ++ identToString ident
133 return $ Ident $ dictName ++ "_" ++ identToString ident