@@ -29,12 +29,12 @@ import Language.PureScript.CodeGen.Common (identToJs)
2929
3030import Control.Applicative
3131import Control.Monad.State
32- import Control.Arrow (second )
32+ import Control.Arrow (Arrow ( .. ), second )
3333import Data.Maybe (catMaybes )
3434
3535import qualified Data.Map as M
3636
37- type MemberMap = M. Map (ModuleName , ProperName ) ([String ], [(String , Type )])
37+ type MemberMap = M. Map (ModuleName , ProperName ) ([String ], [(Ident , Type )])
3838
3939type Desugar = StateT MemberMap (Either ErrorStack )
4040
@@ -98,19 +98,23 @@ desugarDecl mn (PositionedDeclaration pos d) = do
9898 return (dr, map (PositionedDeclaration pos) ds)
9999desugarDecl _ other = return (Nothing , [other])
100100
101- memberToNameAndType :: Declaration -> (String , Type )
102- memberToNameAndType (TypeDeclaration ident ty) = (identToJs ident, ty)
101+ memberToNameAndType :: Declaration -> (Ident , Type )
102+ memberToNameAndType (TypeDeclaration ident ty) = (ident, ty)
103103memberToNameAndType (PositionedDeclaration _ d) = memberToNameAndType d
104104memberToNameAndType _ = error " Invalid declaration in type class definition"
105105
106+ identToProperty :: Ident -> String
107+ identToProperty (Ident name) = name
108+ identToProperty (Op op) = op
109+
106110typeClassDictionaryDeclaration :: ProperName -> [String ] -> [Declaration ] -> Declaration
107111typeClassDictionaryDeclaration name args members =
108- TypeSynonymDeclaration name args (TypeApp tyObject $ rowFromList (map memberToNameAndType members, REmpty ))
112+ TypeSynonymDeclaration name args (TypeApp tyObject $ rowFromList (map (first identToProperty . memberToNameAndType) members, REmpty ))
109113
110114typeClassMemberToDictionaryAccessor :: ModuleName -> ProperName -> [String ] -> Declaration -> Declaration
111115typeClassMemberToDictionaryAccessor mn name args (TypeDeclaration ident ty) =
112116 ExternDeclaration TypeClassAccessorImport ident
113- (Just (JSFunction (Just $ identToJs ident) [" dict" ] (JSBlock [JSReturn (JSAccessor (identToJs ident) (JSVar " dict" ))])))
117+ (Just (JSFunction (Just $ identToJs ident) [" dict" ] (JSBlock [JSReturn (JSIndexer ( JSStringLiteral (identToProperty ident) ) (JSVar " dict" ))])))
114118 (quantify (ConstrainedType [(Qualified (Just mn) name, map TypeVar args)] ty))
115119typeClassMemberToDictionaryAccessor mn name args (PositionedDeclaration pos d) =
116120 PositionedDeclaration pos $ typeClassMemberToDictionaryAccessor mn name args d
@@ -127,25 +131,25 @@ typeInstanceDictionaryDeclaration name mn deps className tys decls = do
127131 -- Replace the type arguments with the appropriate types in the member types
128132 let memberTypes = map (second (replaceAllTypeVars (zip args tys))) instanceTys
129133 -- Create values for the type instance members
130- memberNames <- mapM (memberToNameAndValue memberTypes) decls
134+ memberNames <- map (first identToProperty) <$> mapM (memberToNameAndValue memberTypes) decls
131135 -- Create the type of the dictionary
132136 -- The type is an object type, but depending on type instance dependencies, may be constrained.
133137 -- The dictionary itself is an object literal, but for reasons related to recursion, the dictionary
134138 -- must be guarded by at least one function abstraction. For that reason, if the dictionary has no
135139 -- dependencies, we introduce an unnamed function parameter.
136- let dictTy = TypeApp tyObject (rowFromList (memberTypes, REmpty ))
140+ let dictTy = TypeApp tyObject (rowFromList (map (first identToProperty) memberTypes, REmpty ))
137141 constrainedTy = quantify (if null deps then function unit dictTy else ConstrainedType deps dictTy)
138142 dict = if null deps then Abs (Left (Ident " _" )) (ObjectLiteral memberNames) else ObjectLiteral memberNames
139143 return $ ValueDeclaration name TypeInstanceDictionaryValue [] Nothing (TypedValue True dict constrainedTy)
140144 where
141145 unit :: Type
142146 unit = TypeApp tyObject REmpty
143147
144- memberToNameAndValue :: [(String , Type )] -> Declaration -> Desugar (String , Value )
148+ memberToNameAndValue :: [(Ident , Type )] -> Declaration -> Desugar (Ident , Value )
145149 memberToNameAndValue tys' d@ (ValueDeclaration ident _ _ _ _) = do
146- _ <- lift . maybe (Left $ mkErrorStack " Type class member type not found" Nothing ) Right $ lookup (identToJs ident) tys'
150+ _ <- lift . maybe (Left $ mkErrorStack " Type class member type not found" Nothing ) Right $ lookup ident tys'
147151 let memberValue = typeInstanceDictionaryEntryValue d
148- return (identToJs ident, memberValue)
152+ return (ident, memberValue)
149153 memberToNameAndValue tys' (PositionedDeclaration pos d) = do
150154 (ident, val) <- memberToNameAndValue tys' d
151155 return (ident, PositionedValue pos val)
0 commit comments