1 package org
.argeo
.util
.register
;
3 import java
.util
.ArrayList
;
5 import java
.util
.concurrent
.CompletableFuture
;
6 import java
.util
.concurrent
.CompletionStage
;
7 import java
.util
.concurrent
.Future
;
8 import java
.util
.function
.Consumer
;
10 public class Singleton
<T
> {
11 private final Class
<T
> clss
;
12 private final CompletableFuture
<T
> registrationStage
;
13 private final List
<Consumer
<T
>> unregistrationHooks
= new ArrayList
<>();
15 public Singleton(Class
<T
> clss
, CompletableFuture
<T
> registrationStage
) {
17 this.registrationStage
= registrationStage
;
20 CompletionStage
<T
> getRegistrationStage() {
21 return registrationStage
.minimalCompletionStage();
24 public void addUnregistrationHook(Consumer
<T
> todo
) {
25 unregistrationHooks
.add(todo
);
28 public Future
<T
> getValue() {
29 return registrationStage
.copy();
32 public CompletableFuture
<Void
> prepareUnregistration(Void v
) {
33 List
<CompletableFuture
<Void
>> lst
= new ArrayList
<>();
34 for (Consumer
<T
> hook
: unregistrationHooks
) {
35 lst
.add(registrationStage
.thenAcceptAsync(hook
));
37 CompletableFuture
<Void
> prepareUnregistrationStage
= CompletableFuture
38 .allOf(lst
.toArray(new CompletableFuture
<?
>[lst
.size()]));
39 return prepareUnregistrationStage
;