@@ -18,6 +18,7 @@ import qualified AST.Type as Type
1818import qualified Canonicalize.Environment as Env
1919import qualified Canonicalize.Environment.Dups as Dups
2020import qualified Data.Bag as Bag
21+import qualified Data.Index as Index
2122import qualified Elm.Name as N
2223import qualified Reporting.Annotation as A
2324import qualified Reporting.Error.Canonicalize as Error
@@ -40,7 +41,7 @@ type Result i =
4041
4142canonicalizeArgs :: Env.Env -> [Src.Pattern] -> Result () Can.Args
4243canonicalizeArgs env patterns =
43− case zipWithM (canonicalizeArg env) patterns [ 0 .. length patterns ] of
44+ case Index.indexedTraverse (canonicalizeArg env) patterns of
4445 Result.Result bag warnings (Result.Ok args) ->
4546 do let toError name () () = Error.DuplicateArg name
4647 destructors <- Dups.detect toError (Bag.toList bag)
@@ -51,8 +52,8 @@ canonicalizeArgs env patterns =
5152 Result.Result () warnings (Result.Err err)
5253
5354
54−canonicalizeArg :: Env.Env -> Src.Pattern -> Int -> Result Bag Can.Arg
55−canonicalizeArg env pattern index =
55+canonicalizeArg :: Env.Env -> Index.ZeroBased -> Src.Pattern -> Result Bag Can.Arg
56+canonicalizeArg env index pattern =
5657 Can.Arg index <$> canonicalize env (Can.DRoot index) pattern
5758
5859
@@ -62,7 +63,7 @@ canonicalizeArg env pattern index =
6263
6364canonicalizeMatch :: Env.Env -> Src.Pattern -> Result () Can.Match
6465canonicalizeMatch env pattern =
65− case canonicalize env (Can.DRoot 0) pattern of
66+ case canonicalize env (Can.DRoot Index.first) pattern of
6667 Result.Result bag warnings (Result.Ok cpattern) ->
6768 do let toError name () () = Error.DuplicateArg name
6869 destructors <- Dups.detect toError (Bag.toList bag)
@@ -107,7 +108,7 @@ canonicalizeBinding env def index =
107108 Define region index aname args body maybeType
108109
109110 Valid.Destruct region pattern body ->
110− case canonicalize env (Can.DRoot 0) pattern of
111+ case canonicalize env (Can.DRoot Index.first) pattern of
111112 Result.Result bag warnings (Result.Ok cpattern) ->
112113 do let toError name () () = Error.DuplicateBindingName name
113114 destructors <- Result.untracked (Dups.detect toError (Bag.toList bag))
@@ -164,34 +165,45 @@ canonicalize env destructor (A.A region pattern) =
164165
165166 Src.PTuple a b cs ->
166167 Can.PTuple
167− <$> canonicalize env (Can.DIndex 0 destructor) a
168− <*> canonicalize env (Can.DIndex 1 destructor) b
168+ <$> canonicalize env (Can.DIndex Index.first destructor) a
169+ <*> canonicalize env (Can.DIndex Index.second destructor) b
169170 <*> canonicalizeTuple region env destructor cs
170171
171172 Src.PCtor nameRegion maybePrefix name patterns ->
172173 let
173− canArgs ptrn tipe index =
174+ toCanonicalArg index ptrn tipe =
174175 (,,) index tipe <$> canonicalize env (Can.DIndex index destructor) ptrn
175176 in
176177 do (Env.Pattern home tipe vars args) <- Env.findPattern nameRegion env maybePrefix name
177− Can.PCtor home tipe vars name
178− <$> sequenceA (zipWith3 canArgs patterns args [ 0 .. length patterns ])
178+ verifiedList <- Index.indexedZipWithA toCanonicalArg patterns args
179+ case verifiedList of
180+ Index.LengthMatch cargs ->
181+ Result.ok $ Can.PCtor home tipe vars name cargs
182+
183+ Index.LengthMismatch actualLength expectedLength ->
184+ Result.throw region (error "TODO" actualLength expectedLength)
179185
180186 Src.PList patterns ->
181187 Can.PList <$> canonicalizeList env destructor patterns
182188
183189 Src.PCons first rest ->
184190 Can.PCons
185− <$> canonicalize env (Can.DIndex 0 destructor) first
186− <*> canonicalize env (Can.DIndex 1 destructor) rest
191+ <$> canonicalize env (Can.DIndex Index.first destructor) first
192+ <*> canonicalize env (Can.DIndex Index.second destructor) rest
187193
188194 Src.PAlias ptrn (A.A reg name) ->
189195 do cpattern <- canonicalize env destructor ptrn
190196 let info = Dups.info name reg () (A.A reg destructor)
191197 Result.accumulate (Bag.one info) (Can.PAlias cpattern name)
192198
193− Src.PLiteral lit ->
194− Result.ok (Can.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 ->
206+ Result.ok (Can.PInt int)
195207
196208
197209canonicalizeTuple :: R.Region -> Env.Env -> Can.Destructor -> [Src.Pattern] -> Result Bag (Maybe Can.Pattern)
@@ -201,7 +213,7 @@ canonicalizeTuple tupleRegion env destructor extras =
201213 Result.ok Nothing
202214
203215 [three] ->
204− Just <$> canonicalize env (Can.DIndex 2 destructor) three
216+ Just <$> canonicalize env (Can.DIndex Index.third destructor) three
205217
206218 _ : others ->
207219 let (A.A r1 _, A.A r2 _) = (head others, last others) in
@@ -216,5 +228,5 @@ canonicalizeList env destructor list =
216228
217229 pattern : otherPatterns ->
218230 (:)
219− <$> canonicalize env (Can.DIndex 0 destructor) pattern
220− <*> canonicalizeList env (Can.DIndex 1 destructor) otherPatterns
231+ <$> canonicalize env (Can.DIndex Index.first destructor) pattern
232+ <*> canonicalizeList env (Can.DIndex Index.second destructor) otherPatterns