@@ -72,7 +72,7 @@ parseCase = Case <$> (P.between (C.reserved "case") (C.indented *> C.reserved "o
72 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
72 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
74parseCaseAlternative :: P.Parsec String P.Column (Binder, Value)
74parseCaseAlternative :: P.Parsec String P.Column (Binder, Value)
75−parseCaseAlternative = (,) <$> (parseBinder <* C.lexeme (P.string "->")) <*> parseValue
75+parseCaseAlternative = (,) <$> (parseGuardedBinder <* C.lexeme (P.string "->")) <*> parseValue
77parseBlock :: P.Parsec String P.Column Value
77parseBlock :: P.Parsec String P.Column Value
78parseBlock = Block <$> (C.reserved "do" *> parseManyStatements)
78parseBlock = Block <$> (C.reserved "do" *> parseManyStatements)
@@ -211,6 +211,13 @@ parseArrayBinder :: P.Parsec String P.Column Binder
211parseArrayBinder = C.squares $ ArrayBinder <$> ((C.indented *> parseBinder) `P.sepBy` (C.indented *> C.comma))
211parseArrayBinder = C.squares $ ArrayBinder <$> ((C.indented *> parseBinder) `P.sepBy` (C.indented *> C.comma))
212 <*> P.optionMaybe (C.indented *> C.colon *> C.indented *> parseBinder)
212 <*> P.optionMaybe (C.indented *> C.colon *> C.indented *> parseBinder)
214+parseNamedBinder :: P.Parsec String P.Column Binder
215+parseNamedBinder = NamedBinder <$> (C.parseIdent <* C.indented <* C.lexeme (P.char '@'))
216+ <*> (C.indented *> parseBinder)
218+parseNullBinder :: P.Parsec String P.Column Binder
219+parseNullBinder = C.lexeme (P.char '_') *> P.notFollowedBy C.identLetter *> return NullBinder
214parseIdentifierAndBinder :: P.Parsec String P.Column (String, Binder)
221parseIdentifierAndBinder :: P.Parsec String P.Column (String, Binder)
215parseIdentifierAndBinder = do
222parseIdentifierAndBinder = do
216 name <- C.lexeme C.identifier
223 name <- C.lexeme C.identifier
@@ -220,9 +227,11 @@ parseIdentifierAndBinder = do
221parseBinder :: P.Parsec String P.Column Binder
228parseBinder :: P.Parsec String P.Column Binder
222parseBinder = P.choice (map P.try
229parseBinder = P.choice (map P.try
223− [ parseStringBinder
231+ , parseStringBinder
224 , parseBooleanBinder
232 , parseBooleanBinder
225 , parseNumberBinder
233 , parseNumberBinder
226 , parseVarBinder
235 , parseVarBinder
227 , parseUnaryBinder
236 , parseUnaryBinder
228 , parseNullaryBinder
237 , parseNullaryBinder
@@ -230,6 +239,9 @@ parseBinder = P.choice (map P.try
230 , parseArrayBinder
239 , parseArrayBinder
231 , C.parens parseBinder ])
240 , C.parens parseBinder ])
242+parseGuardedBinder :: P.Parsec String P.Column Binder
243+parseGuardedBinder = flip ($) <$> parseBinder <*> P.option id (GuardedBinder <$> (C.indented *> C.lexeme (P.char '|') *> C.indented *> parseValue))
233parseAssignmentTarget :: P.Parsec String P.Column AssignmentTarget
245parseAssignmentTarget :: P.Parsec String P.Column AssignmentTarget
234parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)
246parseAssignmentTarget = buildExpressionParser operators (AssignVariable <$> C.parseIdent)