on 5b5230c help sign in
elk/src/AST/Pattern.hs
109 lines 2.1 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module AST.Pattern where
4import qualified Data.Set as Set
6import qualified AST.Literal as L
7import qualified AST.Variable as Var
8import qualified Reporting.Annotation as A
9import qualified Reporting.Region as R
12type Pattern ann var =
13 A.Annotated ann (Pattern' ann var)
16data Pattern' ann var
17 = Data var [Pattern ann var]
18 | Record [String]
19 | Alias String (Pattern ann var)
20 | Var String
21 | Anything
22 | Literal L.Literal
25type Raw =
26 Pattern R.Region Var.Raw
29type Raw' =
30 Pattern' R.Region Var.Raw
33type Canonical =
34 Pattern R.Region Var.Canonical
37isVar :: String -> Pattern ann var -> Bool
38isVar name (A.A _ pattern) =
39 case pattern of
40 Var pName ->
41 name == pName
43 _ ->
44 False
47list :: R.Position -> [Raw] -> Raw
48list end patterns =
49 case patterns of
50 [] ->
51 A.at end end (Data (Var.Raw "[]") [])
53 pattern@(A.A (R.Region start _) _) : rest ->
54 A.at start end (Data (Var.Raw "::") [pattern, list end rest])
57consMany :: R.Position -> [Raw] -> Raw
58consMany end patterns =
59 let cons hd@(A.A (R.Region start _) _) tl =
60 A.at start end (Data (Var.Raw "::") [hd, tl])
61 in
62 foldr1 cons patterns
65tuple :: [Raw] -> Raw'
66tuple patterns =
67 Data (Var.Raw ("_Tuple" ++ show (length patterns))) patterns
71-- FIND VARIABLES
74boundVars :: Pattern ann var -> [A.Annotated ann String]
75boundVars (A.A ann pattern) =
76 case pattern of
77 Var x ->
78 [A.A ann x]
80 Alias name realPattern ->
81 A.A ann name : boundVars realPattern
83 Data _ patterns ->
84 concatMap boundVars patterns
86 Record fields ->
87 map (A.A ann) fields
89 Anything ->
90 []
92 Literal _ ->
93 []
96member :: String -> Pattern ann var -> Bool
97member name pattern =
98 any (name==) (map A.drop (boundVars pattern))
101boundVarSet :: Pattern ann var -> Set.Set String
102boundVarSet pattern =
103 Set.fromList (map A.drop (boundVars pattern))
106boundVarList :: Pattern ann var -> [String]
107boundVarList pattern =
108 Set.toList (boundVarSet pattern)