@@ -143,25 +143,16 @@ defmodule ExUnit.Server do
143
143
state =
144
144
update_in (
145
145
state . async_modules ,
146
- & Enum . reduce ( names , & 1 , fn name , q -> :queue . in ( { :module , name } , q ) end )
146
+ & Enum . reduce ( names , & 1 , fn name , q -> :queue . in ( name , q ) end )
147
147
)
148
148
149
149
{ :reply , :ok , take_modules ( state ) }
150
150
end
151
151
152
152
def handle_call ( { :add , true = _async , group , names } , _from , % { loaded: loaded } = state )
153
153
when is_integer ( loaded ) do
154
- { async_groups , async_modules } =
155
- case state . async_groups do
156
- % { ^ group => entries } = async_groups ->
157
- { % { async_groups | group => names ++ entries } , state . async_modules }
158
-
159
- % { } = async_groups ->
160
- { Map . put ( async_groups , group , names ) , :queue . in ( { :group , group } , state . async_modules ) }
161
- end
162
-
163
- { :reply , :ok ,
164
- take_modules ( % { state | async_groups: async_groups , async_modules: async_modules } ) }
154
+ async_groups = Map . update ( state . async_groups , group , names , & ( names ++ & 1 ) )
155
+ { :reply , :ok , take_modules ( % { state | async_groups: async_groups } ) }
165
156
end
166
157
167
158
def handle_call ( { :add , _async? , _group , _names } , _from , state ) do
@@ -174,49 +165,44 @@ defmodule ExUnit.Server do
174
165
175
166
defp take_modules ( % { waiting: { from , count } } = state ) do
176
167
has_async_modules? = not :queue . is_empty ( state . async_modules )
168
+ has_async_groups? = map_size ( state . async_groups ) != 0
177
169
178
170
cond do
179
- not has_async_modules? and state . loaded == :done ->
171
+ not has_async_modules? and not has_async_groups? and state . loaded == :done ->
180
172
GenServer . reply ( from , nil )
181
173
% { state | waiting: nil }
182
174
183
- not has_async_modules? ->
184
- state
185
-
186
- true ->
187
- { async_modules , remaining_modules } = take_until ( count , state . async_modules )
175
+ has_async_modules? ->
176
+ { reply , remaining_modules } = take_until ( count , state . async_modules )
177
+ GenServer . reply ( from , reply )
178
+ % { state | async_modules: remaining_modules , waiting: nil }
188
179
189
- { async_modules , remaining_groups } =
190
- Enum . map_reduce ( async_modules , state . async_groups , fn
191
- { :module , module } , async_groups ->
192
- { [ module ] , async_groups }
180
+ has_async_groups? ->
181
+ groups = Enum . take ( state . async_groups , count )
193
182
194
- { :group , group } , async_groups ->
195
- { group_modules , async_groups } = Map . pop! ( async_groups , group )
196
- { Enum . reverse ( group_modules ) , async_groups }
183
+ { reply , remaining_groups } =
184
+ Enum . map_reduce ( groups , state . async_groups , fn { group , entries } , async_groups ->
185
+ { entries , Map . delete ( async_groups , group ) }
197
186
end )
198
187
199
- GenServer . reply ( from , async_modules )
188
+ GenServer . reply ( from , reply )
189
+ % { state | async_groups: remaining_groups , waiting: nil }
200
190
201
- % {
202
- state
203
- | async_groups: remaining_groups ,
204
- async_modules: remaining_modules ,
205
- waiting: nil
206
- }
191
+ true ->
192
+ state
207
193
end
208
194
end
209
195
210
- # :queue.split fails if the provided count is larger than the queue size;
211
- # as we also want to return the values as a list later, we directly
212
- # return {list, queue} instead of {queue, queue}
196
+ # :queue.split fails if the provided count is larger than the queue size.
197
+ # We also want to return the values as a list of lists, so we directly
198
+ # return {list, queue} instead of {queue, queue}.
213
199
defp take_until ( n , queue ) , do: take_until ( n , queue , [ ] )
214
200
215
201
defp take_until ( 0 , queue , acc ) , do: { Enum . reverse ( acc ) , queue }
216
202
217
203
defp take_until ( n , queue , acc ) do
218
204
case :queue . out ( queue ) do
219
- { { :value , item } , queue } -> take_until ( n - 1 , queue , [ item | acc ] )
205
+ { { :value , item } , queue } -> take_until ( n - 1 , queue , [ [ item ] | acc ] )
220
206
{ :empty , queue } -> { Enum . reverse ( acc ) , queue }
221
207
end
222
208
end
0 commit comments