@@ -13,7 +13,9 @@
1313-----------------------------------------------------------------------------
1414
1515module Language.PureScript.Sugar.TypeClasses (
16− desugarTypeClasses
16+ desugarTypeClasses,
17+ mkDictionaryValueName,
18+ mkDictionaryEntryName
1719) where
1820
1921import Language.PureScript.Declarations
@@ -47,8 +49,9 @@ desugarDecl mn d@(TypeClassDeclaration name arg members) = do
4749 modify (M.insert (mn, name) (arg, tys))
4850 return $ d : typeClassDictionaryDeclaration name arg members : map (typeClassMemberToDictionaryAccessor name arg) members
4951desugarDecl mn d@(TypeInstanceDeclaration deps name ty members) = do
50− entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) members
51− dictDecl <- typeInstanceDictionaryDeclaration mn deps name ty members
52+ desugared <- lift $ desugarCases members
53+ entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) desugared
54+ dictDecl <- typeInstanceDictionaryDeclaration mn deps name ty desugared
5255 return $ d : dictDecl : entries
5356desugarDecl _ other = return [other]
5457
@@ -69,7 +72,7 @@ typeClassMemberToDictionaryAccessor _ _ _ = error "Invalid declaration in type c
6972
7073typeInstanceDictionaryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> [Declaration] -> Desugar Declaration
7174typeInstanceDictionaryDeclaration mn deps name ty decls = do
72− entryName <- mkDictionaryValueName mn name ty
75+ entryName <- lift $ mkDictionaryValueName mn name ty
7376 memberNames <- mapM memberToNameAndValue decls
7477 return $ ExternDeclaration entryName
7578 (Just (JSFunction (Just entryName)
@@ -84,16 +87,15 @@ typeInstanceDictionaryDeclaration mn deps name ty decls = do
8487 memberToNameAndValue _ = error "Invalid declaration in type instance definition"
8588
8689typeInstanceDictionaryEntryDeclaration :: 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
8891 m <- get
8992 let valTy = fromMaybe (error "Type class instance dictionary member is missing in typeInstanceDictionaryEntryDeclaration") $
9093 do (arg, members) <- M.lookup (qualify mn name) m
9194 ty' <- lookup (identToString ident) members
9295 return $ replaceTypeVars arg ty ty'
9396 entryName <- mkDictionaryEntryName mn name ty ident
94− [ValueDeclaration _ _ _ val'] <- lift $ desugarCases [ValueDeclaration entryName binders grd val]
9597 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)))
9799typeInstanceDictionaryEntryDeclaration _ _ _ _ _ = error "Invalid declaration in type instance definition"
98100
99101identToString :: Ident -> String
@@ -111,21 +113,21 @@ quantify ty' = foldr ForAll ty' tyVars
111113 collect (TypeVar v) = [v]
112114 collect _ = []
113115
114−mkDictionaryValueName :: ModuleName -> Qualified ProperName -> Type -> Desugar Ident
116+mkDictionaryValueName :: ModuleName -> Qualified ProperName -> Type -> Either String Ident
115117mkDictionaryValueName mn cl ty = do
116− tyStr <- lift $ typeToString ty
118+ tyStr <- typeToString mn ty
117119 return $ Ident $ "__" ++ qualifiedToString mn cl ++ "_" ++ tyStr
118− where
119− typeToString :: Type -> Either String String
120− typeToString String = return "string"
121− typeToString Number = return "number"
122− typeToString Boolean = return "boolean"
123− typeToString (Array (TypeVar _)) = return "array"
124− typeToString (TypeConstructor ty') = return $ qualifiedToString mn ty'
125− typeToString (TypeApp ty' (TypeVar _)) = typeToString ty'
126− typeToString _ = Left "Type class instance must be of the form T a1 ... an"
120+
121+typeToString :: ModuleName -> Type -> Either String String
122+typeToString _ String = return "string"
123+typeToString _ Number = return "number"
124+typeToString _ Boolean = return "boolean"
125+typeToString _ (Array (TypeVar _)) = return "array"
126+typeToString mn (TypeConstructor ty') = return $ qualifiedToString mn ty'
127+typeToString mn (TypeApp ty' (TypeVar _)) = typeToString mn ty'
128+typeToString _ _ = Left "Type class instance must be of the form T a1 ... an"
127129
128130mkDictionaryEntryName :: ModuleName -> Qualified ProperName -> Type -> Ident -> Desugar Ident
129131mkDictionaryEntryName mn name ty ident = do
130− Ident dictName <- mkDictionaryValueName mn name ty
132+ Ident dictName <- lift $ mkDictionaryValueName mn name ty
131133 return $ Ident $ dictName ++ "_" ++ identToString ident