remove redundant interfaces and generalize shift/reset generics

Turns out Function can do the jobs of both CallbackReceiver and
FunctionReceiver, so I've removed the latter two.

Also, shift and reset should work with a combination of types, not
just a single type, so I've expanded their generic signatures.
This commit is contained in:
Joel Dice 2014-03-21 07:33:50 -06:00
parent 570b5447bf
commit fd778c2c76
10 changed files with 120 additions and 120 deletions

View File

@ -1,15 +0,0 @@
/* Copyright (c) 2008-2013, Avian Contributors
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
There is NO WARRANTY for this software. See license.txt for
details. */
package avian;
public interface CallbackReceiver<T> {
public T receive(Callback<T> callback) throws Exception;
}

View File

@ -127,14 +127,14 @@ public class Continuations {
* specified receiver. * specified receiver.
* *
* <p>This method will either return the result returned by * <p>This method will either return the result returned by
* <code>receiver.receive(Callback)</code>, propagate the exception * <code>receiver.call(Callback)</code>, propagate the exception
* thrown by that method, return the result passed to the * thrown by that method, return the result passed to the
* handleResult(T) method of the continuation, or throw the * handleResult(T) method of the continuation, or throw the
* exception passed to the handleException(Throwable) method of the * exception passed to the handleException(Throwable) method of the
* continuation. * continuation.
*/ */
public static native <T> T callWithCurrentContinuation public static native <T> T callWithCurrentContinuation
(CallbackReceiver<T> receiver) throws Exception; (Function<Callback<T>,T> receiver) throws Exception;
/** /**
* Calls the specified "before" and "after" tasks each time a * Calls the specified "before" and "after" tasks each time a
@ -183,13 +183,13 @@ public class Continuations {
} }
} }
public static <T> T reset(final Callable<T> thunk) throws Exception { public static <B,C> C reset(final Callable<B> thunk) throws Exception {
final Reset reset = new Reset(latestReset.get()); final Reset reset = new Reset(latestReset.get());
latestReset.set(reset); latestReset.set(reset);
try { try {
T result = callWithCurrentContinuation C result = (C) callWithCurrentContinuation
(new CallbackReceiver<T>() { (new Function<Callback<Object>,Object>() {
public T receive(Callback<T> continuation) throws Exception { public Object call(Callback continuation) throws Exception {
reset.continuation = continuation; reset.continuation = continuation;
return thunk.call(); return thunk.call();
} }
@ -207,26 +207,26 @@ public class Continuations {
} }
} }
public static <T> T shift public static <A,B,C> A shift
(final FunctionReceiver<T> receiver) (final Function<Function<A,B>,C> receiver)
throws Exception throws Exception
{ {
return (T) callWithCurrentContinuation(new CallbackReceiver() { return (A) callWithCurrentContinuation
public Object receive(final Callback continuation) { (new Function<Callback<Object>,Object>() {
public Object call(final Callback continuation) {
final Reset reset = latestReset.get(); final Reset reset = latestReset.get();
reset.shifts = new Cell(new Callback() { reset.shifts = new Cell(new Callback() {
public void handleResult(Object ignored) { public void handleResult(Object ignored) {
try { try {
reset.continuation.handleResult reset.continuation.handleResult
(receiver.receive (receiver.call
(new Function() { (new Function() {
public Object call(final Object argument) public Object call(final Object argument)
throws Exception throws Exception
{ {
return callWithCurrentContinuation return callWithCurrentContinuation
(new CallbackReceiver() { (new Function<Callback<Object>,Object>() {
public Object receive public Object call(Callback shiftContinuation)
(Callback shiftContinuation)
throws Exception throws Exception
{ {
reset.shifts = new Cell reset.shifts = new Cell

View File

@ -10,6 +10,6 @@
package avian; package avian;
public interface Function<T> { public interface Function<A,B> {
public T call(T argument) throws Exception; public B call(A argument) throws Exception;
} }

View File

@ -1,15 +0,0 @@
/* Copyright (c) 2008-2013, Avian Contributors
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
There is NO WARRANTY for this software. See license.txt for
details. */
package avian;
public interface FunctionReceiver<T> {
public T receive(Function<T> function) throws Exception;
}

View File

@ -8044,8 +8044,8 @@ callWithCurrentContinuation(MyThread* t, object receiver)
if (root(t, ReceiveMethod) == 0) { if (root(t, ReceiveMethod) == 0) {
object m = resolveMethod object m = resolveMethod
(t, root(t, Machine::BootLoader), "avian/CallbackReceiver", "receive", (t, root(t, Machine::BootLoader), "avian/Function", "call",
"(Lavian/Callback;)Ljava/lang/Object;"); "(Ljava/lang/Object;)Ljava/lang/Object;");
if (m) { if (m) {
setRoot(t, ReceiveMethod, m); setRoot(t, ReceiveMethod, m);

View File

@ -176,8 +176,6 @@
(type unwindResult avian/Continuations$UnwindResult) (type unwindResult avian/Continuations$UnwindResult)
(type callbackReceiver avian/CallbackReceiver)
(type string java/lang/String (type string java/lang/String
(alias data object value) (alias data object value)
(alias length uint32_t count) (alias length uint32_t count)

View File

@ -1,10 +1,9 @@
package extra; package extra;
import static avian.Continuations.shift; import static avian.Continuations.shift;
import static avian.Continuations.reset;
import avian.FunctionReceiver;
import avian.Function; import avian.Function;
import avian.Continuations;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@ -14,10 +13,11 @@ public class ComposableContinuations {
} }
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
expect(2 * reset(new Callable<Integer>() { expect(2 * Continuations.<Integer,Integer>reset(new Callable<Integer>() {
public Integer call() throws Exception { public Integer call() throws Exception {
return 1 + shift(new FunctionReceiver<Integer>() { return 1 + shift
public Integer receive(Function<Integer> continuation) (new Function<Function<Integer,Integer>,Integer>() {
public Integer call(Function<Integer,Integer> continuation)
throws Exception throws Exception
{ {
return continuation.call(5); return continuation.call(5);
@ -26,10 +26,11 @@ public class ComposableContinuations {
} }
}) == 12); }) == 12);
expect(1 + reset(new Callable<Integer>() { expect(1 + Continuations.<Integer,Integer>reset(new Callable<Integer>() {
public Integer call() throws Exception { public Integer call() throws Exception {
return 2 * shift(new FunctionReceiver<Integer>() { return 2 * shift
public Integer receive(Function<Integer> continuation) (new Function<Function<Integer,Integer>,Integer>() {
public Integer call(Function<Integer,Integer> continuation)
throws Exception throws Exception
{ {
return continuation.call(continuation.call(4)); return continuation.call(continuation.call(4));
@ -38,29 +39,53 @@ public class ComposableContinuations {
} }
}) == 17); }) == 17);
expect(equal(reset(new Callable<Cell<Integer>>() { expect
public Cell<Integer> call() throws Exception { (equal
shift(new FunctionReceiver<Cell<Integer>>() { (Continuations.<Cell<Integer>,Cell<Integer>>reset
public Cell<Integer> receive (new Callable<Cell<Integer>>() {
(Function<Cell<Integer>> continuation) public Cell<Integer> call() throws Exception {
shift(new Function<Function<Cell<Integer>,Cell<Integer>>,
Cell<Integer>>()
{
public Cell<Integer> call
(Function<Cell<Integer>,Cell<Integer>> continuation)
throws Exception
{
return cons(1, continuation.call(null));
}
});
shift(new Function<Function<Cell<Integer>,Cell<Integer>>,
Cell<Integer>>()
{
public Cell<Integer> call
(Function<Cell<Integer>,Cell<Integer>> continuation)
throws Exception
{
return cons(2, continuation.call(null));
}
});
return null;
}
}), cons(1, cons(2, null))));
expect
(equal
(Continuations.<String,Integer>reset
(new Callable<String>() {
public String call() throws Exception {
return new String
(shift(new Function<Function<byte[],String>,Integer>() {
public Integer call(Function<byte[],String> continuation)
throws Exception throws Exception
{ {
return cons(1, continuation.call(null)); return Integer.parseInt
(continuation.call(new byte[] { 0x34, 0x32 }));
} }
}); }), "UTF-8");
}
shift(new FunctionReceiver<Cell<Integer>>() { }), 42));
public Cell<Integer> receive
(Function<Cell<Integer>> continuation)
throws Exception
{
return cons(2, continuation.call(null));
}
});
return null;
}
}), cons(1, cons(2, null))));
} }
private static <T> boolean equal(T a, T b) { private static <T> boolean equal(T a, T b) {

View File

@ -2,7 +2,7 @@ package extra;
import static avian.Continuations.callWithCurrentContinuation; import static avian.Continuations.callWithCurrentContinuation;
import avian.CallbackReceiver; import avian.Function;
import avian.Callback; import avian.Callback;
public class Continuations { public class Continuations {
@ -11,22 +11,26 @@ public class Continuations {
} }
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
expect(callWithCurrentContinuation(new CallbackReceiver<Integer>() { expect
public Integer receive(Callback<Integer> continuation) { (callWithCurrentContinuation
continuation.handleResult(42); (new Function<Callback<Integer>,Integer>() {
throw new AssertionError(); public Integer call(Callback<Integer> continuation) {
} continuation.handleResult(42);
}) == 42); throw new AssertionError();
}
}) == 42);
expect(callWithCurrentContinuation(new CallbackReceiver<Integer>() { expect
public Integer receive(Callback<Integer> continuation) { (callWithCurrentContinuation
return 43; (new Function<Callback<Integer>,Integer>() {
} public Integer call(Callback<Integer> continuation) {
}) == 43); return 43;
}
}) == 43);
try { try {
callWithCurrentContinuation(new CallbackReceiver<Integer>() { callWithCurrentContinuation(new Function<Callback<Integer>,Integer>() {
public Integer receive(Callback<Integer> continuation) { public Integer call(Callback<Integer> continuation) {
continuation.handleException(new MyException()); continuation.handleException(new MyException());
throw new AssertionError(); throw new AssertionError();
} }
@ -37,8 +41,8 @@ public class Continuations {
} }
try { try {
callWithCurrentContinuation(new CallbackReceiver<Integer>() { callWithCurrentContinuation(new Function<Callback<Integer>,Integer>() {
public Integer receive(Callback<Integer> continuation) public Integer call(Callback<Integer> continuation)
throws MyException throws MyException
{ {
throw new MyException(); throw new MyException();

View File

@ -2,7 +2,7 @@ package extra;
import static avian.Continuations.callWithCurrentContinuation; import static avian.Continuations.callWithCurrentContinuation;
import avian.CallbackReceiver; import avian.Function;
import avian.Callback; import avian.Callback;
public class Coroutines { public class Coroutines {
@ -40,8 +40,8 @@ public class Coroutines {
final Consumer<Character> consumer = new Consumer<Character>() { final Consumer<Character> consumer = new Consumer<Character>() {
public void consume(final Character c) throws Exception { public void consume(final Character c) throws Exception {
callWithCurrentContinuation(new CallbackReceiver() { callWithCurrentContinuation(new Function<Callback<Object>,Object>() {
public Object receive(Callback continuation) { public Object call(Callback continuation) {
state.produceNext = continuation; state.produceNext = continuation;
state.consumeNext.handleResult(c); state.consumeNext.handleResult(c);
@ -53,9 +53,9 @@ public class Coroutines {
}; };
final Producer<Character> producer = new Producer<Character>() { final Producer<Character> producer = new Producer<Character>() {
final CallbackReceiver<Character> receiver final Function<Callback<Character>,Character> receiver
= new CallbackReceiver<Character>() { = new Function<Callback<Character>,Character>() {
public Character receive(Callback<Character> continuation) public Character call(Callback<Character> continuation)
throws Exception throws Exception
{ {
state.consumeNext = continuation; state.consumeNext = continuation;

View File

@ -3,7 +3,7 @@ package extra;
import static avian.Continuations.callWithCurrentContinuation; import static avian.Continuations.callWithCurrentContinuation;
import static avian.Continuations.dynamicWind; import static avian.Continuations.dynamicWind;
import avian.CallbackReceiver; import avian.Function;
import avian.Callback; import avian.Callback;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@ -86,24 +86,27 @@ public class DynamicWind {
}); });
} }
private void continuationUnwindTest(final CallbackReceiver<Integer> receiver) private void continuationUnwindTest
(final Function<Callback<Integer>,Integer> receiver)
throws Exception throws Exception
{ {
System.out.println("continuationUnwindTest enter"); System.out.println("continuationUnwindTest enter");
try { try {
expect(callWithCurrentContinuation(new CallbackReceiver<Integer>() { expect
public Integer receive(final Callback<Integer> continuation) (callWithCurrentContinuation
throws Exception (new Function<Callback<Integer>,Integer>() {
{ public Integer call(final Callback<Integer> continuation)
unwindTest(new Callable<Integer>() { throws Exception
public Integer call() throws Exception { {
return receiver.receive(continuation); unwindTest(new Callable<Integer>() {
} public Integer call() throws Exception {
}); return receiver.call(continuation);
throw new AssertionError(); }
} });
}) == 42); throw new AssertionError();
}
}) == 42);
} catch (MyException e) { } catch (MyException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -118,8 +121,8 @@ public class DynamicWind {
} }
private void continuationResultUnwind() throws Exception { private void continuationResultUnwind() throws Exception {
continuationUnwindTest(new CallbackReceiver<Integer>() { continuationUnwindTest(new Function<Callback<Integer>,Integer>() {
public Integer receive(final Callback<Integer> continuation) { public Integer call(final Callback<Integer> continuation) {
continuation.handleResult(42); continuation.handleResult(42);
throw new AssertionError(); throw new AssertionError();
} }
@ -127,8 +130,8 @@ public class DynamicWind {
} }
private void continuationExceptionUnwind() throws Exception { private void continuationExceptionUnwind() throws Exception {
continuationUnwindTest(new CallbackReceiver<Integer>() { continuationUnwindTest(new Function<Callback<Integer>,Integer>() {
public Integer receive(final Callback<Integer> continuation) { public Integer call(final Callback<Integer> continuation) {
continuation.handleException(new MyException()); continuation.handleException(new MyException());
throw new AssertionError(); throw new AssertionError();
} }
@ -163,8 +166,8 @@ public class DynamicWind {
task = 1; task = 1;
return callWithCurrentContinuation return callWithCurrentContinuation
(new CallbackReceiver<Integer>() { (new Function<Callback<Integer>,Integer>() {
public Integer receive(final Callback<Integer> continuation) public Integer call(final Callback<Integer> continuation)
throws Exception throws Exception
{ {
continuationReference = continuation; continuationReference = continuation;