on master help sign in
Update to use Data.Index
800c03fEvan Czaplicki
src/Canonicalize/Pattern.hs+29−17
@@ -18,6 +18,7 @@ import qualified AST.Type as Type
18import qualified Canonicalize.Environment as Env
18import qualified Canonicalize.Environment as Env
19import qualified Canonicalize.Environment.Dups as Dups
19import qualified Canonicalize.Environment.Dups as Dups
20import qualified Data.Bag as Bag
20import qualified Data.Bag as Bag
21+import qualified Data.Index as Index
21import qualified Elm.Name as N
22import qualified Elm.Name as N
22import qualified Reporting.Annotation as A
23import qualified Reporting.Annotation as A
23import qualified Reporting.Error.Canonicalize as Error
24import qualified Reporting.Error.Canonicalize as Error
@@ -40,7 +41,7 @@ type Result i =
40
41
41canonicalizeArgs :: Env.Env -> [Src.Pattern] -> Result () Can.Args
42canonicalizeArgs :: Env.Env -> [Src.Pattern] -> Result () Can.Args
42canonicalizeArgs env patterns =
43canonicalizeArgs env patterns =
43− case zipWithM (canonicalizeArg env) patterns [ 0 .. length patterns ] of
44+ case Index.indexedTraverse (canonicalizeArg env) patterns of
44 Result.Result bag warnings (Result.Ok args) ->
45 Result.Result bag warnings (Result.Ok args) ->
45 do let toError name () () = Error.DuplicateArg name
46 do let toError name () () = Error.DuplicateArg name
46 destructors <- Dups.detect toError (Bag.toList bag)
47 destructors <- Dups.detect toError (Bag.toList bag)
@@ -51,8 +52,8 @@ canonicalizeArgs env patterns =
51 Result.Result () warnings (Result.Err err)
52 Result.Result () warnings (Result.Err err)
52
53
53
54
54−canonicalizeArg :: Env.Env -> Src.Pattern -> Int -> Result Bag Can.Arg
55+canonicalizeArg :: Env.Env -> Index.ZeroBased -> Src.Pattern -> Result Bag Can.Arg
55−canonicalizeArg env pattern index =
56+canonicalizeArg env index pattern =
56 Can.Arg index <$> canonicalize env (Can.DRoot index) pattern
57 Can.Arg index <$> canonicalize env (Can.DRoot index) pattern
57
58
58
59
@@ -62,7 +63,7 @@ canonicalizeArg env pattern index =
62
63
63canonicalizeMatch :: Env.Env -> Src.Pattern -> Result () Can.Match
64canonicalizeMatch :: Env.Env -> Src.Pattern -> Result () Can.Match
64canonicalizeMatch env pattern =
65canonicalizeMatch env pattern =
65− case canonicalize env (Can.DRoot 0) pattern of
66+ case canonicalize env (Can.DRoot Index.first) pattern of
66 Result.Result bag warnings (Result.Ok cpattern) ->
67 Result.Result bag warnings (Result.Ok cpattern) ->
67 do let toError name () () = Error.DuplicateArg name
68 do let toError name () () = Error.DuplicateArg name
68 destructors <- Dups.detect toError (Bag.toList bag)
69 destructors <- Dups.detect toError (Bag.toList bag)
@@ -107,7 +108,7 @@ canonicalizeBinding env def index =
107 Define region index aname args body maybeType
108 Define region index aname args body maybeType
108
109
109 Valid.Destruct region pattern body ->
110 Valid.Destruct region pattern body ->
110− case canonicalize env (Can.DRoot 0) pattern of
111+ case canonicalize env (Can.DRoot Index.first) pattern of
111 Result.Result bag warnings (Result.Ok cpattern) ->
112 Result.Result bag warnings (Result.Ok cpattern) ->
112 do let toError name () () = Error.DuplicateBindingName name
113 do let toError name () () = Error.DuplicateBindingName name
113 destructors <- Result.untracked (Dups.detect toError (Bag.toList bag))
114 destructors <- Result.untracked (Dups.detect toError (Bag.toList bag))
@@ -164,34 +165,45 @@ canonicalize env destructor (A.A region pattern) =
164
165
165 Src.PTuple a b cs ->
166 Src.PTuple a b cs ->
166 Can.PTuple
167 Can.PTuple
167− <$> canonicalize env (Can.DIndex 0 destructor) a
168+ <$> canonicalize env (Can.DIndex Index.first destructor) a
168− <*> canonicalize env (Can.DIndex 1 destructor) b
169+ <*> canonicalize env (Can.DIndex Index.second destructor) b
169 <*> canonicalizeTuple region env destructor cs
170 <*> canonicalizeTuple region env destructor cs
170
171
171 Src.PCtor nameRegion maybePrefix name patterns ->
172 Src.PCtor nameRegion maybePrefix name patterns ->
172 let
173 let
173− canArgs ptrn tipe index =
174+ toCanonicalArg index ptrn tipe =
174 (,,) index tipe <$> canonicalize env (Can.DIndex index destructor) ptrn
175 (,,) index tipe <$> canonicalize env (Can.DIndex index destructor) ptrn
175 in
176 in
176 do (Env.Pattern home tipe vars args) <- Env.findPattern nameRegion env maybePrefix name
177 do (Env.Pattern home tipe vars args) <- Env.findPattern nameRegion env maybePrefix name
178+ verifiedList <- Index.indexedZipWithA toCanonicalArg patterns args
179+ case verifiedList of
180+ Index.LengthMatch cargs ->
177− Can.PCtor home tipe vars name
181+ Result.ok $ Can.PCtor home tipe vars name cargs
178− <$> sequenceA (zipWith3 canArgs patterns args [ 0 .. length patterns ])
182+
183+ Index.LengthMismatch actualLength expectedLength ->
184+ Result.throw region (error "TODO" actualLength expectedLength)
179
185
180 Src.PList patterns ->
186 Src.PList patterns ->
181 Can.PList <$> canonicalizeList env destructor patterns
187 Can.PList <$> canonicalizeList env destructor patterns
182
188
183 Src.PCons first rest ->
189 Src.PCons first rest ->
184 Can.PCons
190 Can.PCons
185− <$> canonicalize env (Can.DIndex 0 destructor) first
191+ <$> canonicalize env (Can.DIndex Index.first destructor) first
186− <*> canonicalize env (Can.DIndex 1 destructor) rest
192+ <*> canonicalize env (Can.DIndex Index.second destructor) rest
187
193
188 Src.PAlias ptrn (A.A reg name) ->
194 Src.PAlias ptrn (A.A reg name) ->
189 do cpattern <- canonicalize env destructor ptrn
195 do cpattern <- canonicalize env destructor ptrn
190 let info = Dups.info name reg () (A.A reg destructor)
196 let info = Dups.info name reg () (A.A reg destructor)
191 Result.accumulate (Bag.one info) (Can.PAlias cpattern name)
197 Result.accumulate (Bag.one info) (Can.PAlias cpattern name)
192
198
193− Src.PLiteral lit ->
199+ Src.PChr chr ->
200+ Result.ok (Can.PChr chr)
201+
202+ Src.PStr str ->
203+ Result.ok (Can.PStr str)
204+
205+ Src.PInt int ->
194− Result.ok (Can.PLiteral lit)
206+ Result.ok (Can.PInt int)
195
207
196
208
197canonicalizeTuple :: R.Region -> Env.Env -> Can.Destructor -> [Src.Pattern] -> Result Bag (Maybe Can.Pattern)
209canonicalizeTuple :: R.Region -> Env.Env -> Can.Destructor -> [Src.Pattern] -> Result Bag (Maybe Can.Pattern)
@@ -201,7 +213,7 @@ canonicalizeTuple tupleRegion env destructor extras =
201 Result.ok Nothing
213 Result.ok Nothing
202
214
203 [three] ->
215 [three] ->
204− Just <$> canonicalize env (Can.DIndex 2 destructor) three
216+ Just <$> canonicalize env (Can.DIndex Index.third destructor) three
205
217
206 _ : others ->
218 _ : others ->
207 let (A.A r1 _, A.A r2 _) = (head others, last others) in
219 let (A.A r1 _, A.A r2 _) = (head others, last others) in
@@ -216,5 +228,5 @@ canonicalizeList env destructor list =
216
228
217 pattern : otherPatterns ->
229 pattern : otherPatterns ->
218 (:)
230 (:)
219− <$> canonicalize env (Can.DIndex 0 destructor) pattern
231+ <$> canonicalize env (Can.DIndex Index.first destructor) pattern
220− <*> canonicalizeList env (Can.DIndex 1 destructor) otherPatterns
232+ <*> canonicalizeList env (Can.DIndex Index.second destructor) otherPatterns