@@ -1,8 +1,11 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE OverloadedStrings #-}
2module AST.Pattern where
3module AST.Pattern where
4import qualified Data.List as List
5import qualified Data.List as List
5import qualified Data.Set as Set
6import qualified Data.Set as Set
7+import qualified Data.Text as Text
8+import Data.Text (Text)
7import qualified AST.Literal as L
10import qualified AST.Literal as L
8import qualified AST.Variable as Var
11import qualified AST.Variable as Var
@@ -15,10 +18,10 @@ type Pattern ann var =
17data Pattern' ann var
20data Pattern' ann var
18− = Data var [Pattern ann var]
21+ = Ctor var [Pattern ann var]
19− | Record [String]
22+ | Record [Text]
20− | Alias String (Pattern ann var)
23+ | Alias Text (Pattern ann var)
21− | Var String
24+ | Var Text
22 | Anything
25 | Anything
23 | Literal L.Literal
26 | Literal L.Literal
@@ -35,7 +38,7 @@ type Canonical =
35 Pattern R.Region Var.Canonical
38 Pattern R.Region Var.Canonical
38−isVar :: String -> Pattern ann var -> Bool
41+isVar :: Text -> Pattern ann var -> Bool
39isVar name (A.A _ pattern) =
42isVar name (A.A _ pattern) =
40 case pattern of
43 case pattern of
41 Var pName ->
44 Var pName ->
@@ -49,30 +52,26 @@ list :: R.Position -> [Raw] -> Raw
49list end patterns =
52list end patterns =
50 case patterns of
53 case patterns of
52− A.at end end (Data (Var.Raw "[]") [])
55+ A.at end end (Ctor (Var.Raw "[]") [])
54 pattern@(A.A (R.Region start _) _) : rest ->
57 pattern@(A.A (R.Region start _) _) : rest ->
55− A.at start end (Data (Var.Raw "::") [pattern, list end rest])
58+ A.at start end (Ctor (Var.Raw "::") [pattern, list end rest])
58−consMany :: R.Position -> [Raw] -> Raw
59−consMany end patterns =
60− let cons hd@(A.A (R.Region start _) _) tl =
61− A.at start end (Data (Var.Raw "::") [hd, tl])
66tuple :: [Raw] -> Raw'
61tuple :: [Raw] -> Raw'
67tuple patterns =
62tuple patterns =
68− Data (Var.Raw ("_Tuple" ++ show (length patterns))) patterns
65+ Text.append "_Tuple" (Text.pack (show (length patterns)))
67+ Ctor (Var.Raw name) patterns
72-- FIND VARIABLES
71-- FIND VARIABLES
75−boundVars :: Pattern ann var -> [A.Annotated ann String]
74+boundVars :: Pattern ann var -> [A.Annotated ann Text]
76boundVars (A.A ann pattern) =
75boundVars (A.A ann pattern) =
77 case pattern of
76 case pattern of
@@ -81,7 +80,7 @@ boundVars (A.A ann pattern) =
81 Alias name realPattern ->
80 Alias name realPattern ->
82 A.A ann name : boundVars realPattern
81 A.A ann name : boundVars realPattern
84− Data _ patterns ->
83+ Ctor _ patterns ->
85 concatMap boundVars patterns
84 concatMap boundVars patterns
87 Record fields ->
86 Record fields ->
@@ -94,17 +93,17 @@ boundVars (A.A ann pattern) =
97−member :: String -> Pattern ann var -> Bool
96+member :: Text -> Pattern ann var -> Bool
98member name pattern =
97member name pattern =
99− any (name==) (map A.drop (boundVars pattern))
98+ elem name (map A.drop (boundVars pattern))
102−boundVarSet :: Pattern ann var -> Set.Set String
101+boundVarSet :: Pattern ann var -> Set.Set Text
103boundVarSet pattern =
102boundVarSet pattern =
104 Set.fromList (map A.drop (boundVars pattern))
103 Set.fromList (map A.drop (boundVars pattern))
107−boundVarList :: Pattern ann var -> [String]
106+boundVarList :: Pattern ann var -> [Text]
108boundVarList pattern =
107boundVarList pattern =
109 Set.toList (boundVarSet pattern)
108 Set.toList (boundVarSet pattern)
@@ -117,15 +116,15 @@ toString :: Bool -> Canonical -> String
117toString needsParens (A.A _ pattern) =
116toString needsParens (A.A _ pattern) =
118 case pattern of
117 case pattern of
119 Var name ->
118 Var name ->
120− name
119+ Text.unpack name
122− Data name [] ->
121+ Ctor name [] ->
123 if Var.isTuple name then
122 if Var.isTuple name then
126 Var.toString name
125 Var.toString name
128− Data name args ->
127+ Ctor name args ->
129 if Var.isTuple name then
128 if Var.isTuple name then
130 "( " ++ List.intercalate ", " (map (toString False) args) ++ " )"
129 "( " ++ List.intercalate ", " (map (toString False) args) ++ " )"
@@ -133,11 +132,11 @@ toString needsParens (A.A _ pattern) =
133 Var.toString name ++ concatMap ((" "++) . toString True) args
132 Var.toString name ++ concatMap ((" "++) . toString True) args
135 Record fields ->
134 Record fields ->
136− "{" ++ List.intercalate "," fields ++ "}"
135+ "{" ++ List.intercalate "," (map Text.unpack fields) ++ "}"
138 Alias alias subPattern ->
137 Alias alias subPattern ->
139 parensIf needsParens $
138 parensIf needsParens $
140− toString False subPattern ++ " as " ++ alias
139+ toString False subPattern ++ " as " ++ Text.unpack alias
142 Anything ->
141 Anything ->