1
1
package gears .async
2
+ import language .experimental .captureChecking
3
+
2
4
import scala .collection .mutable
3
5
import scala .util .Success
4
6
5
7
import Future .Promise
8
+ import scala .annotation .unchecked .uncheckedCaptures
6
9
7
10
/** A group of cancellable objects that are completed together. Cancelling the group means cancelling all its
8
11
* uncompleted members.
9
12
*/
10
13
class CompletionGroup extends Cancellable .Tracking :
11
- private val members : mutable.Set [Cancellable ] = mutable.Set ()
14
+ private val members : mutable.Set [( Cancellable ^ ) @ uncheckedCaptures ] = mutable.Set [( Cancellable ^ ) @ uncheckedCaptures] ()
12
15
private var canceled : Boolean = false
13
16
private var cancelWait : Option [Promise [Unit ]] = None
14
17
@@ -29,14 +32,14 @@ class CompletionGroup extends Cancellable.Tracking:
29
32
unlink()
30
33
31
34
/** Add given member to the members set. If the group has already been cancelled, cancels that member immediately. */
32
- def add (member : Cancellable ): Unit =
35
+ def add (member : Cancellable ^ ): Unit =
33
36
val alreadyCancelled = synchronized :
34
37
members += member // Add this member no matter what since we'll wait for it still
35
38
canceled
36
39
if alreadyCancelled then member.cancel()
37
40
38
41
/** Remove given member from the members set if it is an element */
39
- def drop (member : Cancellable ): Unit = synchronized :
42
+ def drop (member : Cancellable ^ ): Unit = synchronized :
40
43
members -= member
41
44
if members.isEmpty && cancelWait.isDefined then cancelWait.get.complete(Success (()))
42
45
@@ -50,8 +53,8 @@ object CompletionGroup:
50
53
object Unlinked extends CompletionGroup :
51
54
override def cancel (): Unit = ()
52
55
override def waitCompletion ()(using Async ): Unit = ()
53
- override def add (member : Cancellable ): Unit = ()
54
- override def drop (member : Cancellable ): Unit = ()
56
+ override def add (member : Cancellable ^ ): Unit = ()
57
+ override def drop (member : Cancellable ^ ): Unit = ()
55
58
end Unlinked
56
59
57
60
end CompletionGroup
0 commit comments