diff --git a/.idea/misc.xml b/.idea/misc.xml
index 1763e15..fb40be9 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/src/main/java/org/syndicate_lang/actors/Actor.java b/src/main/java/org/syndicate_lang/actors/Actor.java
index 487ade5..9e5225a 100644
--- a/src/main/java/org/syndicate_lang/actors/Actor.java
+++ b/src/main/java/org/syndicate_lang/actors/Actor.java
@@ -5,6 +5,7 @@ import java.util.Map;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -63,11 +64,11 @@ public class Actor implements Executor {
return new Actor().ref(o);
}
- public static Promise[ boot(ThrowingSupplier f) {
+ public static Promise][ boot(Function f) {
final Promise][ p = new Promise<>();
final Actor a = new Actor();
a.execute(
- () -> p.resolveCalling(() -> a.ref(f.get())),
+ () -> Turn.forActor(a, t -> p.resolveCalling(() -> a.ref(f.apply(t)))),
() -> p.rejectWith(new ActorTerminated(a)));
return p;
}
diff --git a/src/main/java/org/syndicate_lang/actors/Turn.java b/src/main/java/org/syndicate_lang/actors/Turn.java
index b33afa7..1f7d9ca 100644
--- a/src/main/java/org/syndicate_lang/actors/Turn.java
+++ b/src/main/java/org/syndicate_lang/actors/Turn.java
@@ -114,14 +114,12 @@ public class Turn {
});
}
- public Promise sync_(Ref peer) {
- Promise p = new Promise<>();
+ public void sync_(Ref peer, Consumer k) {
this._sync_(peer, this.ref(new Entity() {
public void message_(Turn t, Object _message) {
- p.resolveWith(t);
+ k.accept(t);
}
}));
- return p;
}
private void _sync_(Ref peer, Ref callback) {
@@ -134,4 +132,16 @@ public class Turn {
this.enqueue(peer.getActor(), t -> peer.getEntity().message_(t, body));
}
}
+
+ public void later(long delayMilliseconds, Consumer action) {
+ _actor.later(delayMilliseconds, () -> Turn.forActor(_actor, action));
+ }
+
+ public PeriodicTimer every(long periodMilliseconds, Consumer action) {
+ return every(0, periodMilliseconds, action);
+ }
+
+ public PeriodicTimer every(long initialDelayMilliseconds, long periodMilliseconds, Consumer action) {
+ return _actor.every(initialDelayMilliseconds, periodMilliseconds, () -> Turn.forActor(_actor, action));
+ }
}
diff --git a/src/test/java/org/syndicate_lang/actors/example/example1/IValueHolder.java b/src/test/java/org/syndicate_lang/actors/example/example1/IValueHolder.java
index ceef0e7..06af87f 100644
--- a/src/test/java/org/syndicate_lang/actors/example/example1/IValueHolder.java
+++ b/src/test/java/org/syndicate_lang/actors/example/example1/IValueHolder.java
@@ -1,6 +1,8 @@
package org.syndicate_lang.actors.example.example1;
-public interface IValueHolder {
- T get();
- void set(T newValue);
-}
+import org.syndicate_lang.actors.Ref;
+
+public interface IValueHolder {
+ record Get(Ref k) implements IValueHolder {}
+ record Set(T newValue) implements IValueHolder {}
+}
\ No newline at end of file
diff --git a/src/test/java/org/syndicate_lang/actors/example/example1/Main.java b/src/test/java/org/syndicate_lang/actors/example/example1/Main.java
index 803becf..99548d1 100644
--- a/src/test/java/org/syndicate_lang/actors/example/example1/Main.java
+++ b/src/test/java/org/syndicate_lang/actors/example/example1/Main.java
@@ -1,23 +1,35 @@
package org.syndicate_lang.actors.example.example1;
import org.syndicate_lang.actors.Actor;
+import org.syndicate_lang.actors.Entity;
import org.syndicate_lang.actors.Ref;
+import org.syndicate_lang.actors.Turn;
-public class Main {
+public class Main extends Entity {
public static void main(String[] args) throws InterruptedException {
Actor.convenientLogging();
- final var vh = Actor.forEntity(new ValueHolder<>("There"));
- vh.getActor().daemonize();
- final var m = Actor.forEntity(new Main());
- m.async(10, (m_, ac) -> m_.run(ac, vh));
+ Turn.forActor(new Actor().daemonize(), t -> {
+ final var vh = Actor.forEntity(new ValueHolder<>("There"));
+ vh.getActor().daemonize();
+ final var m = Actor.boot(u -> {
+ Main main = new Main();
+ u.later(10, v -> main.run(v, vh));
+ return main;
+ });
- @SuppressWarnings("unchecked")
- IValueHolder vv = vh.syncProxy(IValueHolder.class);
-
- System.out.println("Value: " + vv.get());
- vv.set("Second");
- System.out.println("Value: " + vv.get());
- System.out.println("Underlying: " + Ref.from(vv));
+ t.message_(vh, new IValueHolder.Get(t.ref(new Entity() {
+ public void message_(Turn t0, Object v0) {
+ System.out.println("Value: " + v0);
+ t0.message_(vh, new IValueHolder.Set<>("Second"));
+ t0.message_(vh, new IValueHolder.Get(t0.ref(new Entity() {
+ public void message_(Turn t1, Object v1) {
+ System.out.println("Value: " + v1);
+ System.out.println("Cell: " + vh);
+ }
+ })));
+ }
+ })));
+ });
Actor.awaitAll();
System.out.println("Overall main returning");
@@ -26,14 +38,22 @@ public class Main {
private Actor me;
private int greetingCounter = 0;
- public void run(Actor me, Ref> vh) {
- this.me = me;
- this.greet((String) vh.syncProxy(IValueHolder.class).get());
- vh.syncVoid((v, _ac) -> v.set("World"));
- me.every(1000, () -> {
- if (greetingCounter >= 3) me.stop();
- this.greet(vh.sync((v, _ac) -> v.get()).await());
- });
+ public void run(Turn t0, Ref vh) {
+ me = t0.getActor();
+ t0.message_(vh, new IValueHolder.Get(t0.ref(new Entity() {
+ public void message_(Turn t1, Object v1) {
+ Main.this.greet((String) v1);
+ t1.message_(vh, new IValueHolder.Set<>("World"));
+ t1.every(1000, t -> {
+ if (greetingCounter >= 3) t.quit();
+ t.message_(vh, new IValueHolder.Get(t.ref(new Entity() {
+ public void message_(Turn t2, Object v2) {
+ Main.this.greet((String) v2);
+ }
+ })));
+ });
+ }
+ })));
}
public void greet(String who) {
diff --git a/src/test/java/org/syndicate_lang/actors/example/example1/ValueHolder.java b/src/test/java/org/syndicate_lang/actors/example/example1/ValueHolder.java
index 8cea1de..fa22f88 100644
--- a/src/test/java/org/syndicate_lang/actors/example/example1/ValueHolder.java
+++ b/src/test/java/org/syndicate_lang/actors/example/example1/ValueHolder.java
@@ -1,17 +1,22 @@
package org.syndicate_lang.actors.example.example1;
-public class ValueHolder implements IValueHolder {
+import org.syndicate_lang.actors.Entity;
+import org.syndicate_lang.actors.Turn;
+
+public class ValueHolder extends Entity {
private T value;
public ValueHolder(T initialValue) {
this.value = initialValue;
}
- public T get() {
- return this.value;
- }
-
- public void set(T newValue) {
- this.value = newValue;
+ @Override
+ public void message_(Turn turn, Object body) {
+ if (body instanceof IValueHolder.Get op) {
+ turn.message_(op.k(), this.value);
+ } else if (body instanceof IValueHolder.Set) {
+ IValueHolder.Set op = (IValueHolder.Set) body;
+ this.value = op.newValue();
+ }
}
}
diff --git a/src/test/test.iml b/src/test/test.iml
index bb46440..283f7c9 100644
--- a/src/test/test.iml
+++ b/src/test/test.iml
@@ -4,6 +4,7 @@
+
]