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 @@ +