Skip to content

Commit f09b790

Browse files
committed
Refactor futures layout
1 parent 11de41f commit f09b790

File tree

4 files changed

+59
-37
lines changed

4 files changed

+59
-37
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.mv.utilsx.async;
2+
3+
public class MVSync {
4+
5+
//blanket class, implement async runtime in here
6+
7+
}

src/main/java/dev/mv/utilsx/async/SignalFuture.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/main/java/dev/mv/utilsx/futures/Future.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package dev.mv.utilsx.futures;
22

3-
import dev.mv.utilsx.async.Signal;
3+
import dev.mv.utilsx.generic.Null;
44
import org.jetbrains.annotations.NotNull;
55

6+
import java.time.Duration;
7+
68
public interface Future<T> {
79

810
@NotNull
@@ -18,4 +20,24 @@ default T awaitSync() {
1820
signal.await();
1921
}
2022
}
23+
24+
static Future<Null> yield() {
25+
return new Yield();
26+
}
27+
28+
static Future<Null> sleep(Duration duration) {
29+
return new Sleep(duration);
30+
}
31+
32+
static Future<Null> sleep(long millis) {
33+
return new Sleep(millis);
34+
}
35+
36+
static <T> Future<T> pending() {
37+
return new Pending<>();
38+
}
39+
40+
static <T> Future<T> ready(T value) {
41+
return new Ready<>(value);
42+
}
2143
}

src/main/java/dev/mv/utilsx/async/Signal.java renamed to src/main/java/dev/mv/utilsx/futures/Signal.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
package dev.mv.utilsx.async;
1+
package dev.mv.utilsx.futures;
22

3-
import dev.mv.utilsx.futures.*;
43
import dev.mv.utilsx.generic.Null;
54

65
import java.time.Duration;
@@ -10,10 +9,10 @@
109

1110
public class Signal implements Wake {
1211

13-
final Mutex<Boolean> ready = new Mutex<>(false);
14-
final CondVar condition = new CondVar(ready);
15-
final List<Waker> wakers = new ArrayList<>(1);
16-
final AtomicInteger waiting = new AtomicInteger(0);
12+
private final Mutex<Boolean> ready = new Mutex<>(false);
13+
private final CondVar condition = new CondVar(ready);
14+
private final List<Waker> wakers = new ArrayList<>(1);
15+
private final AtomicInteger waiting = new AtomicInteger(0);
1716

1817
public boolean ready() {
1918
return ready.get();
@@ -62,4 +61,28 @@ public void wake() {
6261
condition.signalAll();
6362
ready.unlock();
6463
}
64+
65+
public static class SignalFuture implements Future<Null> {
66+
67+
private final Signal signal;
68+
private boolean started = false;
69+
70+
private SignalFuture(Signal signal) {
71+
this.signal = signal;
72+
}
73+
74+
@Override
75+
public Poll<Null> poll(Context context) {
76+
try {
77+
signal.ready.lock();
78+
if (signal.ready.getLocked()) return new Poll<>(Null.INSTANCE);
79+
if (!started) {
80+
signal.wakers.add(context.waker());
81+
}
82+
return new Poll<>();
83+
} finally {
84+
signal.ready.unlock();
85+
}
86+
}
87+
}
6588
}

0 commit comments

Comments
 (0)