001 // Copyright 2010 Waterken Inc. under the terms of the MIT X license
002 // found at http://www.opensource.org/licenses/mit-license.html
003 package org.waterken.delayed;
004
005 import java.io.Serializable;
006
007 import org.ref_send.list.List;
008 import org.ref_send.promise.Deferred;
009 import org.ref_send.promise.Do;
010 import org.ref_send.promise.Eventual;
011 import org.ref_send.promise.Promise;
012
013 /**
014 * A delayed resolution test.
015 */
016 public final class
017 Relay {
018 private Relay() {}
019
020 static public Promise<?>
021 make(final Eventual _, final Forwarder forwarder_) {
022 class Return extends Do<Boolean,Promise<Boolean>>
023 implements Serializable {
024 static private final long serialVersionUID = 1L;
025
026 public Promise<Boolean>
027 fulfill(final Boolean value) { return Eventual.ref(value); }
028 }
029 class Extract extends Do<Deferred<Boolean>,Promise<Boolean>>
030 implements Serializable {
031 static private final long serialVersionUID = 1L;
032
033 public Promise<Boolean>
034 fulfill(final Deferred<Boolean> forward) throws Exception {
035 return _.when(forward.promise, new Return());
036 }
037 }
038 class Resolve extends Do<Deferred<Boolean>,Void> implements Serializable{
039 static private final long serialVersionUID = 1L;
040
041 public Void
042 fulfill(final Deferred<Boolean> forward) throws Exception {
043 forward.resolver.apply(true);
044 return null;
045 }
046 }
047 final Promise<Deferred<Boolean>> forward = forwarder_.forward();
048 final Promise<Boolean> r = _.when(forward, new Extract());
049 _.when(forward, new Resolve());
050 return r;
051 }
052
053 static public void
054 main(final String[] args) throws Exception {
055 final List<Promise<?>> work = List.list();
056 final Eventual _ = new Eventual(work.appender());
057 final Promise<?> result = make(_, ForwarderMaker.make(_));
058 while (!work.isEmpty()) { work.pop().call(); }
059 result.call();
060 }
061 }