1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Pattern
11import qualified Data.Map.Strict as Map
13import qualified AST.Canonical as Can
14import qualified AST.Source as Src
15import qualified Canonicalize.Environment as Env
16import qualified Canonicalize.Environment.Dups as Dups
17import qualified Data.Index as Index
18import qualified Elm.Name as N
19import qualified Reporting.Annotation as A
20import qualified Reporting.Error.Canonicalize as Error
21import qualified Reporting.Region as R
22import qualified Reporting.Result as Result
30 Result.Result i w Error.Error a
34 Map.Map N.Name R.Region
41verify :: Error.DuplicatePatternContext -> Result DupsDict w a -> Result i w (a, Bindings)
42verify context (Result.Result k) =
43 Result.Result $ \info warnings bad good ->
45 (\_ warnings1 errors ->
46 bad info warnings1 errors
48 (\bindings warnings1 value ->
49 case Dups.detect (Error.DuplicatePattern context) bindings of
52 (\() () errs -> bad info warnings1 errs)
53 (\() () dict -> good info warnings1 (value, dict))
65canonicalize :: Env.Env -> Src.Pattern -> Result DupsDict w Can.Pattern
66canonicalize env (A.At region pattern) =
70 Result.ok Can.PAnything
73 logVar name region (Can.PVar name)
76 logFields fields (Can.PRecord (map A.toValue fields))
83 <$> canonicalize env a
84 <*> canonicalize env b
85 <*> canonicalizeTuple region env cs
87 Src.PCtor nameRegion name patterns ->
88 canonicalizeCtor env region name patterns =<< Env.findCtor nameRegion env name
90 Src.PCtorQual nameRegion home name patterns ->
91 canonicalizeCtor env region name patterns =<< Env.findCtorQual nameRegion env home name
94 Can.PList <$> canonicalizeList env patterns
96 Src.PCons first rest ->
98 <$> canonicalize env first
99 <*> canonicalize env rest
101 Src.PAlias ptrn (A.At reg name) ->
102 do cpattern <- canonicalize env ptrn
103 logVar name reg (Can.PAlias cpattern name)
106 Result.ok (Can.PChr chr)
109 Result.ok (Can.PStr str)
112 Result.ok (Can.PInt int)
115canonicalizeCtor :: Env.Env -> R.Region -> N.Name -> [Src.Pattern] -> Env.Ctor -> Result DupsDict w Can.Pattern_
116canonicalizeCtor env region name patterns ctor =
118 Env.Ctor home tipe union index args ->
120 toCanonicalArg argIndex argPattern argTipe =
121 Can.PatternCtorArg argIndex argTipe <$> canonicalize env argPattern
123 do verifiedList <- Index.indexedZipWithA toCanonicalArg patterns args
125 Index.LengthMatch cargs ->
126 Result.ok (Can.PCtor home tipe union name index cargs)
128 Index.LengthMismatch actualLength expectedLength ->
129 Result.throw (Error.BadArity region Error.PatternArity name actualLength expectedLength)
131 Env.RecordCtor _ _ _ ->
132 Result.throw (Error.PatternHasRecordCtor region name)
135canonicalizeTuple :: R.Region -> Env.Env -> [Src.Pattern] -> Result DupsDict w (Maybe Can.Pattern)
136canonicalizeTuple tupleRegion env extras =
142 Just <$> canonicalize env three
145 Result.throw $ Error.TupleLargerThanThree tupleRegion
148canonicalizeList :: Env.Env -> [Src.Pattern] -> Result DupsDict w [Can.Pattern]
149canonicalizeList env list =
154 pattern : otherPatterns ->
156 <$> canonicalize env pattern
157 <*> canonicalizeList env otherPatterns
164logVar :: N.Name -> R.Region -> a -> Result DupsDict w a
165logVar name region value =
166 Result.Result $ \bindings warnings _ ok ->
167 ok (Dups.insert name region region bindings) warnings value
170logFields :: [A.Located N.Name] -> a -> Result DupsDict w a
171logFields fields value =
173 addField (A.At region name) dict =
174 Dups.insert name region region dict
176 Result.Result $ \bindings warnings _ ok ->
177 ok (foldr addField bindings fields) warnings value
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