@@ -135,59 +135,58 @@ addVarsHelp localVars vars =
135135collectLowerVars :: Valid.Module -> Result (Map.Map N.Name ())
136136collectLowerVars (Valid.Module _ _ _ _ _ decls _ _ _ effects) =
137137 let
138− declToInfo (A.A _ (Valid.Decl (A.A region name) _ _ _)) =
139− Dups.info name region () ()
138+ addDecl (A.A _ (Valid.Decl (A.A region name) _ _ _)) dict =
139+ Dups.insert name region () () dict
140140
141− portToInfo (Valid.Port (A.A region name) _) =
142− Dups.info name region () ()
141+ addPort (Valid.Port (A.A region name) _) dict =
142+ Dups.insert name region () () dict
143143
144− effectInfo =
144+ effectDict =
145145 case effects of
146146 Valid.NoEffects ->
147− []
147+ Dups.none
148148
149149 Valid.Ports ports ->
150− map portToInfo ports
150+ foldr addPort Dups.none ports
151151
152152 Valid.Manager _ manager ->
153153 case manager of
154154 Valid.Cmd (A.A region _) ->
155− [ Dups.info "command" region () () ]
155+ Dups.one "command" region () ()
156156
157157 Valid.Sub (A.A region _) ->
158− [ Dups.info "subscription" region () () ]
158+ Dups.one "subscription" region () ()
159159
160160 Valid.Fx (A.A regionCmd _) (A.A regionSub _) ->
161− [ Dups.info "command" regionCmd () ()
162− , Dups.info "subscription" regionSub () ()
163− ]
161+ Dups.union
162+ (Dups.one "command" regionCmd () ())
163+ (Dups.one "subscription" regionSub () ())
164164
165165 toError name () () =
166166 Error.DuplicateDecl name
167167 in
168− Dups.detect toError $
169− effectInfo ++ map declToInfo decls
168+ Dups.detect toError $ foldr addDecl effectDict decls
170169
171170
172171collectUpperVars :: Valid.Module -> Result (Map.Map N.Name ())
173172collectUpperVars (Valid.Module _ _ _ _ _ _ unions aliases _ _) =
174173 let
175− unionToInfos (Valid.Union (A.A _ name) _ ctors) =
176− map (ctorToInfo name) ctors
174+ addUnion (Valid.Union (A.A _ name) _ ctors) dict =
175+ foldr (addCtor name) dict ctors
177176
178− ctorToInfo tipe (A.A region name, _args) =
179− Dups.info name region (Error.UnionCtor tipe) ()
177+ addCtor tipe (A.A region name, _args) dict =
178+ Dups.insert name region (Error.UnionCtor tipe) () dict
180179
181− aliasToInfos (Valid.Alias (A.A region name) _ (A.A _ tipe)) =
180+ addAlias (Valid.Alias (A.A region name) _ (A.A _ tipe)) dict =
182181 case tipe of
183182 Src.TRecord _ Nothing ->
184− [ Dups.info name region Error.RecordCtor () ]
183+ Dups.insert name region Error.RecordCtor () dict
185184
186185 _ ->
187− []
186+ dict
188187 in
189188 Dups.detect Error.DuplicateCtor $
190− concatMap aliasToInfos aliases ++ concatMap unionToInfos unions
189+ foldr addAlias (foldr addUnion Dups.none unions) aliases
191190
192191
193192
@@ -197,23 +196,25 @@ collectUpperVars (Valid.Module _ _ _ _ _ _ unions aliases _ _) =
197196addTypes :: Valid.Module -> Env.Env -> Result Env.Env
198197addTypes (Valid.Module _ _ _ _ _ _ unions aliases _ _) env =
199198 let
200− aliasToInfo alias@(Valid.Alias (A.A region name) _ tipe) =
199+ aliasToDict alias@(Valid.Alias (A.A region name) _ tipe) =
201200 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))
203202
204− unionToInfo union@(Valid.Union (A.A region name) _ _) =
203+ unionToDict union@(Valid.Union (A.A region name) _ _) =
205204 do arity <- checkUnionFreeVars union
206− return $ Dups.info name region () (Right arity)
205+ return $ Dups.one name region () (Right arity)
207206
208207 toError name () () =
209208 Error.DuplicateType name
210209
211− infos =
212− liftA2 (++)
213− (traverse aliasToInfo aliases)
214− (traverse unionToInfo unions)
210+ combineDicts dicts1 dicts2 =
211+ Dups.union (Dups.unions dicts1) (Dups.unions dicts2)
215212 in
216− do types <- Dups.detect toError =<< infos
213+ do dict <-
214+ liftA2 combineDicts
215+ (traverse aliasToDict aliases)
216+ (traverse unionToDict unions)
217+ types <- Dups.detect toError dict
217218 let (aliasDict, unionDict) = Map.mapEither id types
218219 addTypeAliases aliasDict (addUnionTypes unionDict env)
219220
@@ -326,8 +327,8 @@ getEdges (A.A _ tipe) =
326327checkUnionFreeVars :: Valid.Union -> Result Int
327328checkUnionFreeVars (Valid.Union (A.A unionRegion name) args ctors) =
328329 let
329− toInfo (A.A region arg) =
330− Dups.info arg region () region
330+ addUnion (A.A region arg) dict =
331+ Dups.insert arg region () region dict
331332
332333 toError badArg () () =
333334 Error.DuplicateUnionArg name badArg (map A.drop args)
@@ -335,7 +336,7 @@ checkUnionFreeVars (Valid.Union (A.A unionRegion name) args ctors) =
335336 addCtorFreeVars (_, tipes) freeVars =
336337 foldr addFreeVars freeVars tipes
337338 in
338− do boundVars <- Dups.detect toError (map toInfo args)
339+ do boundVars <- Dups.detect toError (foldr addUnion Dups.none args)
339340 let freeVars = foldr addCtorFreeVars Map.empty ctors
340341 case Map.toList (Map.difference freeVars boundVars) of
341342 [] ->
@@ -351,13 +352,13 @@ checkUnionFreeVars (Valid.Union (A.A unionRegion name) args ctors) =
351352checkAliasFreeVars :: Valid.Alias -> Result [N.Name]
352353checkAliasFreeVars (Valid.Alias (A.A aliasRegion name) args tipe) =
353354 let
354− toInfo (A.A region arg) =
355− Dups.info arg region () region
355+ addAlias (A.A region arg) dict =
356+ Dups.insert arg region () region dict
356357
357358 toError badArg () () =
358359 Error.DuplicateAliasArg name badArg (map A.drop args)
359360 in
360− do boundVars <- Dups.detect toError (map toInfo args)
361+ do boundVars <- Dups.detect toError (foldr addAlias Dups.none args)
361362 let freeVars = addFreeVars tipe Map.empty
362363 let overlap = Map.size (Map.intersection boundVars freeVars)
363364 if Map.size boundVars == overlap && Map.size freeVars == overlap