@@ -1,7 +1,7 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Pattern
2module Canonicalize.Pattern
3− ( canonicalizeArgs
3+ ( canonicalize
4− , canonicalizeMatch
4+ , canonicalizeArgs
5 , canonicalizeBindings
5 , canonicalizeBindings
6 , Binding(..)
6 , Binding(..)
@@ -35,51 +35,50 @@ type Result i =
38−-- CANONICALIZE ARGS
38+-- CANONICALIZE
41−canonicalizeArgs :: Env.Env -> [Src.Pattern] -> Result () Can.Args
41+canonicalize :: Env.Env -> Index.ZeroBased -> Src.Pattern -> Result () (Can.Pattern, Can.Destructors)
42−canonicalizeArgs env patterns =
42+canonicalize env index pattern =
43− case Index.indexedTraverse (canonicalizeArg env) patterns of
43+ case process env (Can.DRoot index) pattern of
44− Result.Result bag warnings (Result.Ok args) ->
44+ Result.Result bag warnings (Result.Ok cpattern) ->
45 do let toError name () () = Error.DuplicateArg name
45 do let toError name () () = Error.DuplicateArg name
46 destructors <- Dups.detect toError (Bag.toList bag)
46 destructors <- Dups.detect toError (Bag.toList bag)
47− Result.Result () warnings $ Result.Ok $
47+ Result.Result () warnings $ Result.Ok (cpattern, destructors)
48− Can.Args args destructors
50 Result.Result _ warnings (Result.Err err) ->
49 Result.Result _ warnings (Result.Err err) ->
51 Result.Result () warnings (Result.Err err)
50 Result.Result () warnings (Result.Err err)
54−canonicalizeArg :: Env.Env -> Index.ZeroBased -> Src.Pattern -> Result Bag Can.Arg
55−canonicalizeArg env index pattern =
56− Can.Arg index <$> canonicalize env (Can.DRoot index) pattern
60−-- CANONICALIZE MATCH
54+-- CANONICALIZE ARGS
63−canonicalizeMatch :: Env.Env -> Src.Pattern -> Result () Can.Match
57+canonicalizeArgs :: Env.Env -> [Src.Pattern] -> Result () Can.Args
64−canonicalizeMatch env pattern =
58+canonicalizeArgs env patterns =
65− case canonicalize env (Can.DRoot Index.first) pattern of
59+ case Index.indexedTraverse (canonicalizeArg env) patterns of
66− Result.Result bag warnings (Result.Ok cpattern) ->
60+ Result.Result bag warnings (Result.Ok args) ->
67 do let toError name () () = Error.DuplicateArg name
61 do let toError name () () = Error.DuplicateArg name
68 destructors <- Dups.detect toError (Bag.toList bag)
62 destructors <- Dups.detect toError (Bag.toList bag)
69 Result.Result () warnings $ Result.Ok $
63 Result.Result () warnings $ Result.Ok $
70− Can.Match cpattern destructors
64+ Can.Args args destructors
72 Result.Result _ warnings (Result.Err err) ->
66 Result.Result _ warnings (Result.Err err) ->
73 Result.Result () warnings (Result.Err err)
67 Result.Result () warnings (Result.Err err)
70+canonicalizeArg :: Env.Env -> Index.ZeroBased -> Src.Pattern -> Result Bag Can.Arg
71+canonicalizeArg env index pattern =
72+ Can.Arg index <$> process env (Can.DRoot index) pattern
77-- CANONICALIZE BINDINGS
76-- CANONICALIZE BINDINGS
80data Binding
79data Binding
81 = Define R.Region Int (A.Located N.Name) [Src.Pattern] Valid.Expr (Maybe Src.Type)
80 = Define R.Region Int (A.Located N.Name) [Src.Pattern] Valid.Expr (Maybe Src.Type)
82− | Destruct R.Region Int Can.Match Valid.Expr
81+ | Destruct R.Region Int Can.Pattern Can.Destructors Valid.Expr
85canonicalizeBindings :: Env.Env -> [Valid.Def] -> Result () ( [Binding], Map.Map N.Name (A.Located Int) )
84canonicalizeBindings :: Env.Env -> [Valid.Def] -> Result () ( [Binding], Map.Map N.Name (A.Located Int) )
@@ -107,12 +106,12 @@ canonicalizeBinding env def index =
107 Define region index aname args body maybeType
106 Define region index aname args body maybeType
109 Valid.Destruct region pattern body ->
108 Valid.Destruct region pattern body ->
110− case canonicalize env (Can.DRoot Index.first) pattern of
109+ case process env (Can.DRoot Index.first) pattern of
111 Result.Result bag warnings (Result.Ok cpattern) ->
110 Result.Result bag warnings (Result.Ok cpattern) ->
112 do let toError name () () = Error.DuplicateBindingName name
111 do let toError name () () = Error.DuplicateBindingName name
113 destructors <- Result.untracked (Dups.detect toError (Bag.toList bag))
112 destructors <- Result.untracked (Dups.detect toError (Bag.toList bag))
114 Result.Result (toKeyBag index bag) warnings $ Result.Ok $
113 Result.Result (toKeyBag index bag) warnings $ Result.Ok $
115− Destruct region index (Can.Match cpattern destructors) body
114+ Destruct region index cpattern destructors body
117 Result.Result bag warnings (Result.Err err) ->
116 Result.Result bag warnings (Result.Err err) ->
118 Result.Result (toKeyBag index bag) warnings (Result.Err err)
117 Result.Result (toKeyBag index bag) warnings (Result.Err err)
@@ -138,8 +137,8 @@ type Bag =
138 Bag.Bag (N.Name, [Dups.Info () (A.Located Can.Destructor)])
137 Bag.Bag (N.Name, [Dups.Info () (A.Located Can.Destructor)])
141−canonicalize :: Env.Env -> Can.Destructor -> Src.Pattern -> Result Bag Can.Pattern
140+process :: Env.Env -> Can.Destructor -> Src.Pattern -> Result Bag Can.Pattern
142−canonicalize env destructor (A.A region pattern) =
141+process env destructor (A.A region pattern) =
143 A.A region <$>
142 A.A region <$>
144 case pattern of
143 case pattern of
145 Src.PAnything ->
144 Src.PAnything ->
@@ -164,15 +163,15 @@ canonicalize env destructor (A.A region pattern) =
165 Src.PTuple a b cs ->
164 Src.PTuple a b cs ->
166 Can.PTuple
165 Can.PTuple
167− <$> canonicalize env (Can.DIndex Index.first destructor) a
166+ <$> process env (Can.DIndex Index.first destructor) a
168− <*> canonicalize env (Can.DIndex Index.second destructor) b
167+ <*> process env (Can.DIndex Index.second destructor) b
169− <*> canonicalizeTuple region env destructor cs
168+ <*> processTuple region env destructor cs
171 Src.PCtor nameRegion maybePrefix name patterns ->
170 Src.PCtor nameRegion maybePrefix name patterns ->
173 toCanonicalArg index ptrn tipe =
172 toCanonicalArg index ptrn tipe =
174 Can.PatternCtorArg index tipe
173 Can.PatternCtorArg index tipe
175− <$> canonicalize env (Can.DIndex index destructor) ptrn
174+ <$> process env (Can.DIndex index destructor) ptrn
177 do (Env.Pattern home tipe vars args) <- Env.findPattern nameRegion env maybePrefix name
176 do (Env.Pattern home tipe vars args) <- Env.findPattern nameRegion env maybePrefix name
178 verifiedList <- Index.indexedZipWithA toCanonicalArg patterns args
177 verifiedList <- Index.indexedZipWithA toCanonicalArg patterns args
@@ -184,15 +183,15 @@ canonicalize env destructor (A.A region pattern) =
184 Result.throw region (error "TODO" actualLength expectedLength)
183 Result.throw region (error "TODO" actualLength expectedLength)
186 Src.PList patterns ->
185 Src.PList patterns ->
187− Can.PList <$> canonicalizeList env destructor patterns
186+ Can.PList <$> processList env destructor patterns
189 Src.PCons first rest ->
188 Src.PCons first rest ->
190 Can.PCons
189 Can.PCons
191− <$> canonicalize env (Can.DIndex Index.first destructor) first
190+ <$> process env (Can.DIndex Index.first destructor) first
192− <*> canonicalize env (Can.DIndex Index.second destructor) rest
191+ <*> process env (Can.DIndex Index.second destructor) rest
194 Src.PAlias ptrn (A.A reg name) ->
193 Src.PAlias ptrn (A.A reg name) ->
195− do cpattern <- canonicalize env destructor ptrn
194+ do cpattern <- process env destructor ptrn
196 let info = Dups.info name reg () (A.A reg destructor)
195 let info = Dups.info name reg () (A.A reg destructor)
197 Result.accumulate (Bag.one info) (Can.PAlias cpattern name)
196 Result.accumulate (Bag.one info) (Can.PAlias cpattern name)
@@ -206,27 +205,27 @@ canonicalize env destructor (A.A region pattern) =
206 Result.ok (Can.PInt int)
205 Result.ok (Can.PInt int)
209−canonicalizeTuple :: R.Region -> Env.Env -> Can.Destructor -> [Src.Pattern] -> Result Bag (Maybe Can.Pattern)
208+processTuple :: R.Region -> Env.Env -> Can.Destructor -> [Src.Pattern] -> Result Bag (Maybe Can.Pattern)
210−canonicalizeTuple tupleRegion env destructor extras =
209+processTuple tupleRegion env destructor extras =
211 case extras of
210 case extras of
213 Result.ok Nothing
212 Result.ok Nothing
215 [three] ->
214 [three] ->
216− Just <$> canonicalize env (Can.DIndex Index.third destructor) three
215+ Just <$> process env (Can.DIndex Index.third destructor) three
218 _ : others ->
217 _ : others ->
219 let (A.A r1 _, A.A r2 _) = (head others, last others) in
218 let (A.A r1 _, A.A r2 _) = (head others, last others) in
220 Result.throw tupleRegion (Error.TupleLargerThanThree (R.merge r1 r2))
219 Result.throw tupleRegion (Error.TupleLargerThanThree (R.merge r1 r2))
223−canonicalizeList :: Env.Env -> Can.Destructor -> [Src.Pattern] -> Result Bag [Can.Pattern]
222+processList :: Env.Env -> Can.Destructor -> [Src.Pattern] -> Result Bag [Can.Pattern]
224−canonicalizeList env destructor list =
223+processList env destructor list =
225 case list of
224 case list of
227 Result.ok []
226 Result.ok []
229 pattern : otherPatterns ->
228 pattern : otherPatterns ->
231− <$> canonicalize env (Can.DIndex Index.first destructor) pattern
230+ <$> process env (Can.DIndex Index.first destructor) pattern
232− <*> canonicalizeList env (Can.DIndex Index.second destructor) otherPatterns
231+ <*> processList env (Can.DIndex Index.second destructor) otherPatterns