on master help sign in
Make it possible to use qualified tags in pattern args
f9fabf2Evan Czaplicki
src/Parse/Pattern.hs+20−17
@@ -18,23 +18,21 @@ basic =
18 addLocation $
18 addLocation $
19 choice
19 choice
20 [ char '_' >> return P.Anything
20 [ char '_' >> return P.Anything
21− , stringToPattern <$> var
21+ , P.Var <$> lowVar
22+ , chunksToPatterns <$> dotSep1 capVar
22 , P.Literal <$> Literal.literal
23 , P.Literal <$> Literal.literal
23 ]
24 ]
24 where
25 where
25− stringToPattern str =
26+ chunksToPatterns chunks =
26− case str of
27+ case List.intercalate "." chunks of
27− "True" ->
28+ "True" ->
28− P.Literal (L.Boolean True)
29+ P.Literal (L.Boolean True)
29
30
30− "False" ->
31+ "False" ->
31− P.Literal (L.Boolean False)
32+ P.Literal (L.Boolean False)
32
33
33− c:_ | isUpper c ->
34+ name ->
34− P.Data (Var.Raw str) []
35+ P.Data (Var.Raw name) []
35−
36− _ ->
37− P.Var str
38
36
39
37
40asPattern :: IParser P.Raw -> IParser P.Raw
38asPattern :: IParser P.Raw -> IParser P.Raw
@@ -94,11 +92,16 @@ term =
94patternConstructor :: IParser P.Raw
92patternConstructor :: IParser P.Raw
95patternConstructor =
93patternConstructor =
96 addLocation $
94 addLocation $
97− do v <- List.intercalate "." <$> dotSep1 capVar
95+ do name <- List.intercalate "." <$> dotSep1 capVar
98− case v of
96+ case name of
97+ "True" ->
99− "True" -> return $ P.Literal (L.Boolean True)
98+ return $ P.Literal (L.Boolean True)
99+
100+ "False" ->
100− "False" -> return $ P.Literal (L.Boolean False)
101+ return $ P.Literal (L.Boolean False)
102+
103+ _ ->
101− _ -> P.Data (Var.Raw v) <$> spacePrefix term
104+ P.Data (Var.Raw name) <$> spacePrefix term
102
105
103
106
104expr :: IParser P.Raw
107expr :: IParser P.Raw