1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Pattern
11import qualified Data.Map.Strict as Map
12import qualified Data.Name as Name
14import qualified AST.Canonical as Can
15import qualified AST.Source as Src
16import qualified Canonicalize.Environment as Env
17import qualified Canonicalize.Environment.Dups as Dups
18import qualified Data.Index as Index
19import qualified Elm.ModuleName as ModuleName
20import qualified Reporting.Annotation as A
21import qualified Reporting.Error.Canonicalize as Error
22import qualified Reporting.Result as Result
30 Result.Result i w Error.Error a
34 Map.Map Name.Name A.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 -> A.Region -> Name.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 if tipe == Name.bool && home == ModuleName.basics then
127 Result.ok (Can.PBool union (name == Name.true))
129 Result.ok (Can.PCtor home tipe union name index cargs)
131 Index.LengthMismatch actualLength expectedLength ->
132 Result.throw (Error.BadArity region Error.PatternArity name expectedLength actualLength)
134 Env.RecordCtor _ _ _ ->
135 Result.throw (Error.PatternHasRecordCtor region name)
138canonicalizeTuple :: A.Region -> Env.Env -> [Src.Pattern] -> Result DupsDict w (Maybe Can.Pattern)
139canonicalizeTuple tupleRegion env extras =
145 Just <$> canonicalize env three
148 Result.throw $ Error.TupleLargerThanThree tupleRegion
151canonicalizeList :: Env.Env -> [Src.Pattern] -> Result DupsDict w [Can.Pattern]
152canonicalizeList env list =
157 pattern : otherPatterns ->
159 <$> canonicalize env pattern
160 <*> canonicalizeList env otherPatterns
167logVar :: Name.Name -> A.Region -> a -> Result DupsDict w a
168logVar name region value =
169 Result.Result $ \bindings warnings _ ok ->
170 ok (Dups.insert name region region bindings) warnings value
173logFields :: [A.Located Name.Name] -> a -> Result DupsDict w a
174logFields fields value =
176 addField (A.At region name) dict =
177 Dups.insert name region region dict
179 Result.Result $ \bindings warnings _ ok ->
180 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