@@ -135,59 +135,58 @@ addVarsHelp localVars vars =
135collectLowerVars :: Valid.Module -> Result (Map.Map N.Name ())
135collectLowerVars :: Valid.Module -> Result (Map.Map N.Name ())
136collectLowerVars (Valid.Module _ _ _ _ _ decls _ _ _ effects) =
136collectLowerVars (Valid.Module _ _ _ _ _ decls _ _ _ effects) =
138− declToInfo (A.A _ (Valid.Decl (A.A region name) _ _ _)) =
138+ addDecl (A.A _ (Valid.Decl (A.A region name) _ _ _)) dict =
139− Dups.info name region () ()
139+ Dups.insert name region () () dict
141− portToInfo (Valid.Port (A.A region name) _) =
141+ addPort (Valid.Port (A.A region name) _) dict =
142− Dups.info name region () ()
142+ Dups.insert name region () () dict
144− effectInfo =
144+ effectDict =
145 case effects of
145 case effects of
146 Valid.NoEffects ->
146 Valid.NoEffects ->
149 Valid.Ports ports ->
149 Valid.Ports ports ->
150− map portToInfo ports
150+ foldr addPort Dups.none ports
152 Valid.Manager _ manager ->
152 Valid.Manager _ manager ->
153 case manager of
153 case manager of
154 Valid.Cmd (A.A region _) ->
154 Valid.Cmd (A.A region _) ->
155− [ Dups.info "command" region () () ]
155+ Dups.one "command" region () ()
157 Valid.Sub (A.A region _) ->
157 Valid.Sub (A.A region _) ->
158− [ Dups.info "subscription" region () () ]
158+ Dups.one "subscription" region () ()
160 Valid.Fx (A.A regionCmd _) (A.A regionSub _) ->
160 Valid.Fx (A.A regionCmd _) (A.A regionSub _) ->
161− [ Dups.info "command" regionCmd () ()
162+ (Dups.one "command" regionCmd () ())
162− , Dups.info "subscription" regionSub () ()
163+ (Dups.one "subscription" regionSub () ())
165 toError name () () =
165 toError name () () =
166 Error.DuplicateDecl name
166 Error.DuplicateDecl name
168− Dups.detect toError $
168+ Dups.detect toError $ foldr addDecl effectDict decls
169− effectInfo ++ map declToInfo decls
172collectUpperVars :: Valid.Module -> Result (Map.Map N.Name ())
171collectUpperVars :: Valid.Module -> Result (Map.Map N.Name ())
173collectUpperVars (Valid.Module _ _ _ _ _ _ unions aliases _ _) =
172collectUpperVars (Valid.Module _ _ _ _ _ _ unions aliases _ _) =
175− unionToInfos (Valid.Union (A.A _ name) _ ctors) =
174+ addUnion (Valid.Union (A.A _ name) _ ctors) dict =
176− map (ctorToInfo name) ctors
175+ foldr (addCtor name) dict ctors
178− ctorToInfo tipe (A.A region name, _args) =
177+ addCtor tipe (A.A region name, _args) dict =
179− Dups.info name region (Error.UnionCtor tipe) ()
178+ Dups.insert name region (Error.UnionCtor tipe) () dict
181− aliasToInfos (Valid.Alias (A.A region name) _ (A.A _ tipe)) =
180+ addAlias (Valid.Alias (A.A region name) _ (A.A _ tipe)) dict =
182 case tipe of
181 case tipe of
183 Src.TRecord _ Nothing ->
182 Src.TRecord _ Nothing ->
184− [ Dups.info name region Error.RecordCtor () ]
183+ Dups.insert name region Error.RecordCtor () dict
189 Dups.detect Error.DuplicateCtor $
188 Dups.detect Error.DuplicateCtor $
190− concatMap aliasToInfos aliases ++ concatMap unionToInfos unions
189+ foldr addAlias (foldr addUnion Dups.none unions) aliases
@@ -197,23 +196,25 @@ collectUpperVars (Valid.Module _ _ _ _ _ _ unions aliases _ _) =
197addTypes :: Valid.Module -> Env.Env -> Result Env.Env
196addTypes :: Valid.Module -> Env.Env -> Result Env.Env
198addTypes (Valid.Module _ _ _ _ _ _ unions aliases _ _) env =
197addTypes (Valid.Module _ _ _ _ _ _ unions aliases _ _) env =
200− aliasToInfo alias@(Valid.Alias (A.A region name) _ tipe) =
199+ aliasToDict alias@(Valid.Alias (A.A region name) _ tipe) =
201 do args <- checkAliasFreeVars alias
200 do args <- checkAliasFreeVars alias
202− return $ Dups.info name region () (Left (Alias region name args tipe))
201+ return $ Dups.one name region () (Left (Alias region name args tipe))
204− unionToInfo union@(Valid.Union (A.A region name) _ _) =
203+ unionToDict union@(Valid.Union (A.A region name) _ _) =
205 do arity <- checkUnionFreeVars union
204 do arity <- checkUnionFreeVars union
206− return $ Dups.info name region () (Right arity)
205+ return $ Dups.one name region () (Right arity)
208 toError name () () =
207 toError name () () =
209 Error.DuplicateType name
208 Error.DuplicateType name
211− infos =
210+ combineDicts dicts1 dicts2 =
212− liftA2 (++)
211+ Dups.union (Dups.unions dicts1) (Dups.unions dicts2)
213− (traverse aliasToInfo aliases)
214− (traverse unionToInfo unions)
215+ (traverse aliasToDict aliases)
216+ (traverse unionToDict unions)
216− do types <- Dups.detect toError =<< infos
217+ types <- Dups.detect toError dict
217 let (aliasDict, unionDict) = Map.mapEither id types
218 let (aliasDict, unionDict) = Map.mapEither id types
218 addTypeAliases aliasDict (addUnionTypes unionDict env)
219 addTypeAliases aliasDict (addUnionTypes unionDict env)
@@ -326,8 +327,8 @@ getEdges (A.A _ tipe) =
326checkUnionFreeVars :: Valid.Union -> Result Int
327checkUnionFreeVars :: Valid.Union -> Result Int
327checkUnionFreeVars (Valid.Union (A.A unionRegion name) args ctors) =
328checkUnionFreeVars (Valid.Union (A.A unionRegion name) args ctors) =
329− toInfo (A.A region arg) =
330+ addUnion (A.A region arg) dict =
330− Dups.info arg region () region
331+ Dups.insert arg region () region dict
332 toError badArg () () =
333 toError badArg () () =
333 Error.DuplicateUnionArg name badArg (map A.drop args)
334 Error.DuplicateUnionArg name badArg (map A.drop args)
@@ -335,7 +336,7 @@ checkUnionFreeVars (Valid.Union (A.A unionRegion name) args ctors) =
335 addCtorFreeVars (_, tipes) freeVars =
336 addCtorFreeVars (_, tipes) freeVars =
336 foldr addFreeVars freeVars tipes
337 foldr addFreeVars freeVars tipes
338− do boundVars <- Dups.detect toError (map toInfo args)
339+ do boundVars <- Dups.detect toError (foldr addUnion Dups.none args)
339 let freeVars = foldr addCtorFreeVars Map.empty ctors
340 let freeVars = foldr addCtorFreeVars Map.empty ctors
340 case Map.toList (Map.difference freeVars boundVars) of
341 case Map.toList (Map.difference freeVars boundVars) of
@@ -351,13 +352,13 @@ checkUnionFreeVars (Valid.Union (A.A unionRegion name) args ctors) =
351checkAliasFreeVars :: Valid.Alias -> Result [N.Name]
352checkAliasFreeVars :: Valid.Alias -> Result [N.Name]
352checkAliasFreeVars (Valid.Alias (A.A aliasRegion name) args tipe) =
353checkAliasFreeVars (Valid.Alias (A.A aliasRegion name) args tipe) =
354− toInfo (A.A region arg) =
355+ addAlias (A.A region arg) dict =
355− Dups.info arg region () region
356+ Dups.insert arg region () region dict
357 toError badArg () () =
358 toError badArg () () =
358 Error.DuplicateAliasArg name badArg (map A.drop args)
359 Error.DuplicateAliasArg name badArg (map A.drop args)
360− do boundVars <- Dups.detect toError (map toInfo args)
361+ do boundVars <- Dups.detect toError (foldr addAlias Dups.none args)
361 let freeVars = addFreeVars tipe Map.empty
362 let freeVars = addFreeVars tipe Map.empty
362 let overlap = Map.size (Map.intersection boundVars freeVars)
363 let overlap = Map.size (Map.intersection boundVars freeVars)
363 if Map.size boundVars == overlap && Map.size freeVars == overlap
364 if Map.size boundVars == overlap && Map.size freeVars == overlap