1{-# OPTIONS_GHC -Wall #-}
2module AST.Pattern where
4import qualified AST.Helpers as Help
6import Text.PrettyPrint as PP
7import qualified Data.Set as Set
9import qualified AST.Variable as Var
10import AST.Literal as Literal
14 = Data var [Pattern var]
16 | Alias String (Pattern var)
19 | Literal Literal.Literal
20 deriving (Eq, Ord, Show)
27type CanonicalPattern =
31cons :: RawPattern -> RawPattern -> RawPattern
33 Data (Var.Raw "::") [h,t]
38 Data (Var.Raw "[]") []
41list :: [RawPattern] -> RawPattern
43 foldr cons nil patterns
46tuple :: [RawPattern] -> RawPattern
48 Data (Var.Raw ("_Tuple" ++ show (length patterns))) patterns
51boundVarList :: Pattern var -> [String]
53 Set.toList (boundVars pattern)
56boundVars :: Pattern var -> Set.Set String
59 Var x -> Set.singleton x
60 Alias x p -> Set.insert x (boundVars p)
61 Data _ ps -> Set.unions (map boundVars ps)
62 Record fields -> Set.fromList fields
64 Literal _ -> Set.empty
67instance Var.ToString var => Pretty (Pattern var) where
77 PP.braces (commaCat (map variable fields))
80 prettyParens p <+> PP.text "as" <+> variable x
85 Data name [hd,tl] | Var.toString name == "::" ->
86 parensIf isCons (pretty hd) <+> PP.text "::" <+> pretty tl
90 Data ctor _ -> Var.toString ctor == "::"
94 let name' = Var.toString name
97 then PP.parens (commaCat (map pretty ps))
98 else hsep (PP.text name' : map prettyParens ps)
101prettyParens :: Var.ToString var => Pattern var -> Doc
102prettyParens pattern =
103 parensIf needsThem (pretty pattern)
107 Data name (_:_) | not (Help.isTuple (Var.toString name)) -> True
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