@@ -143,25 +143,16 @@ defmodule ExUnit.Server do
143143 state =
144144 update_in (
145145 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 )
147147 )
148148
149149 { :reply , :ok , take_modules ( state ) }
150150 end
151151
152152 def handle_call ( { :add , true = _async , group , names } , _from , % { loaded: loaded } = state )
153153 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 } ) }
165156 end
166157
167158 def handle_call ( { :add , _async? , _group , _names } , _from , state ) do
@@ -174,49 +165,44 @@ defmodule ExUnit.Server do
174165
175166 defp take_modules ( % { waiting: { from , count } } = state ) do
176167 has_async_modules? = not :queue . is_empty ( state . async_modules )
168+ has_async_groups? = map_size ( state . async_groups ) != 0
177169
178170 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 ->
180172 GenServer . reply ( from , nil )
181173 % { state | waiting: nil }
182174
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 }
188179
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 )
193182
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 ) }
197186 end )
198187
199- GenServer . reply ( from , async_modules )
188+ GenServer . reply ( from , reply )
189+ % { state | async_groups: remaining_groups , waiting: nil }
200190
201- % {
202- state
203- | async_groups: remaining_groups ,
204- async_modules: remaining_modules ,
205- waiting: nil
206- }
191+ true ->
192+ state
207193 end
208194 end
209195
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}.
213199 defp take_until ( n , queue ) , do: take_until ( n , queue , [ ] )
214200
215201 defp take_until ( 0 , queue , acc ) , do: { Enum . reverse ( acc ) , queue }
216202
217203 defp take_until ( n , queue , acc ) do
218204 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 ] )
220206 { :empty , queue } -> { Enum . reverse ( acc ) , queue }
221207 end
222208 end
0 commit comments