2module Parse.Pattern (term, expr) where
4import Control.Applicative ((<$>),(<*>),pure)
6import Control.Monad.State
7import Data.Char (isUpper)
8import Data.List (intercalate)
9import Text.Parsec hiding (newline,spaces,State)
10import Text.Parsec.Indent
14import SourceSyntax.Literal
15import SourceSyntax.Pattern hiding (tuple, list)
16import qualified SourceSyntax.Pattern as Pattern
18basic :: IParser Pattern
20 [ char '_' >> return PAnything
23 "True" -> PLiteral (Boolean True)
24 "False" -> PLiteral (Boolean False)
25 c : _ -> if isUpper c then PData v [] else PVar v
26 , PLiteral <$> literal
29asPattern :: Pattern -> IParser Pattern
31 var <- optionMaybe (try (whitespace >> reserved "as" >> whitespace >> lowVar))
33 Just v -> PAlias v pattern
36record :: IParser Pattern
37record = PRecord <$> brackets (commaSep1 lowVar)
39tuple :: IParser Pattern
40tuple = do ps <- parens (commaSep expr)
41 return $ case ps of { [p] -> p; _ -> Pattern.tuple ps }
43list :: IParser Pattern
44list = Pattern.list <$> braces (commaSep expr)
46term :: IParser Pattern
48 (choice [ record, tuple, list, basic ]) <?> "pattern"
50patternConstructor :: IParser Pattern
51patternConstructor = do
52 v <- intercalate "." <$> dotSep1 capVar
54 "True" -> return $ PLiteral (Boolean True)
55 "False" -> return $ PLiteral (Boolean False)
56 _ -> PData v <$> spacePrefix term
58expr :: IParser Pattern
60 patterns <- consSep1 (patternConstructor <|> term)
61 asPattern (foldr1 Pattern.cons patterns) <?> "pattern"
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