1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module AST.Pattern where
5import qualified Data.List as List
6import Data.Monoid ((<>))
7import qualified Data.Set as Set
9import qualified Data.Text as Text
10import qualified Data.Text.Lazy as LazyText
11import Data.Text.Lazy.Builder (Builder, fromText, toLazyText)
13import qualified AST.Literal as L
14import qualified AST.Variable as Var
15import qualified Reporting.Annotation as A
16import qualified Reporting.Region as R
20 A.Annotated ann (Pattern' ann var)
24 = Ctor var [Pattern ann var]
26 | Alias Text (Pattern ann var)
33 Pattern R.Region Var.Raw
37 Pattern' R.Region Var.Raw
41 Pattern R.Region Var.Canonical
44isVar :: Text -> Pattern ann var -> Bool
45isVar name (A.A _ pattern) =
54list :: R.Position -> [Raw] -> Raw
58 A.at end end (Ctor (Var.Raw "[]") [])
60 pattern@(A.A (R.Region start _) _) : rest ->
61 A.at start end (Ctor (Var.Raw "::") [pattern, list end rest])
68 Text.append "_Tuple" (Text.pack (show (length patterns)))
70 Ctor (Var.Raw name) patterns
77boundVars :: Pattern ann var -> [A.Annotated ann Text]
78boundVars (A.A ann pattern) =
83 Alias name realPattern ->
84 A.A ann name : boundVars realPattern
87 concatMap boundVars patterns
99member :: Text -> Pattern ann var -> Bool
101 elem name (map A.drop (boundVars pattern))
104boundVarSet :: Pattern ann var -> Set.Set Text
106 Set.fromList (map A.drop (boundVars pattern))
109boundVarList :: Pattern ann var -> [Text]
110boundVarList pattern =
111 Set.toList (boundVarSet pattern)
118toString :: Canonical -> String
120 LazyText.unpack (toLazyText (toBuilder False var))
123toText :: Canonical -> Text
125 LazyText.toStrict (toLazyText (toBuilder False var))
128toBuilder :: Bool -> Canonical -> Builder
129toBuilder needsParens (A.A _ pattern) =
135 if Var.isTuple name then "()" else fromText (Var.toText name)
138 if Var.isTuple name then
139 "( " <> mconcat (List.intersperse ", " (map (toBuilder False) args)) <> " )"
141 parensIf needsParens $
142 fromText (Var.toText name) <> mconcat (map (\arg -> " " <> toBuilder True arg) args)
145 "{" <> mconcat (List.intersperse "," (map fromText fields)) <> "}"
147 Alias alias subPattern ->
148 parensIf needsParens $
149 toBuilder False subPattern <> " as " <> fromText alias
158parensIf :: Bool -> Builder -> Builder
159parensIf needsParens builder =
160 if needsParens then "(" <> builder <> ")" else builder
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