1-----------------------------------------------------------------------------
3-- Module : PureScript.Parser.Types
4-- Copyright : (c) Phil Freeman 2013
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
13-----------------------------------------------------------------------------
15module PureScript.Parser.Types (
21import PureScript.Types
22import PureScript.Parser.State
23import PureScript.Parser.Common
24import Control.Applicative
25import qualified Text.Parsec as P
26import qualified Text.Parsec.Expr as P
27import Control.Arrow (Arrow(..))
29parseNumber :: P.Parsec String ParseState Type
30parseNumber = const Number <$> reserved "Number"
32parseString :: P.Parsec String ParseState Type
33parseString = const String <$> reserved "String"
35parseBoolean :: P.Parsec String ParseState Type
36parseBoolean = const Boolean <$> reserved "Boolean"
38parseArray :: P.Parsec String ParseState Type
39parseArray = squares $ Array <$> parseType
41parseObject :: P.Parsec String ParseState Type
42parseObject = braces $ Object <$> parseRow
44parseFunction :: P.Parsec String ParseState Type
46 args <- lexeme $ parens $ commaSep parseType
47 lexeme $ P.string "->"
48 resultType <- parseType
49 return $ Function args resultType
51parseTypeVariable :: P.Parsec String ParseState Type
52parseTypeVariable = TypeVar <$> identifier
54parseTypeConstructor :: P.Parsec String ParseState Type
55parseTypeConstructor = TypeConstructor <$> properName
57parseTypeAtom :: P.Parsec String ParseState Type
58parseTypeAtom = indented *> P.choice (map P.try
66 , parseTypeConstructor
69parsePolyType :: P.Parsec String ParseState PolyType
70parsePolyType = (PolyType <$> P.option [] (indented *> reserved "forall" *> many (indented *> identifier) <* indented <* dot)
71 <*> parseType) P.<?> "polymorphic type"
73parseType :: P.Parsec String ParseState Type
74parseType = (P.buildExpressionParser operators . buildPostfixParser postfixTable $ parseTypeAtom) P.<?> "type"
76 postfixTable :: [P.Parsec String ParseState (Type -> Type)]
77 postfixTable = [ flip TypeApp <$> (indented *> parseTypeAtom) ]
78 operators = [ [ P.Infix (lexeme (P.try (P.string "->")) >> return (\t1 t2 -> Function [t1] t2)) P.AssocRight ] ]
80parseNameAndType :: P.Parsec String ParseState (String, Type)
81parseNameAndType = (,) <$> (indented *> identifier <* indented <* lexeme (P.string "::")) <*> parseType
83parseRowEnding :: P.Parsec String ParseState Row
84parseRowEnding = P.option REmpty (RowVar <$> (lexeme (indented *> P.char '|') *> indented *> identifier))
86parseRow :: P.Parsec String ParseState Row
87parseRow = (fromList <$> (parseNameAndType `P.sepBy` (indented *> semi)) <*> parseRowEnding) P.<?> "row"
89 fromList :: [(String, Type)] -> Row -> Row
91 fromList ((name, t):ts) r = RCons name t (fromList ts r)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list