001    // Copyright 2007 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.bounce;
004    
005    import static org.ref_send.promise.Eventual.ref;
006    
007    import java.io.Serializable;
008    import java.math.BigDecimal;
009    import java.math.BigInteger;
010    
011    import org.joe_e.Struct;
012    import org.joe_e.array.BooleanArray;
013    import org.joe_e.array.ByteArray;
014    import org.joe_e.array.CharArray;
015    import org.joe_e.array.ConstArray;
016    import org.joe_e.array.DoubleArray;
017    import org.joe_e.array.FloatArray;
018    import org.joe_e.array.ImmutableArray;
019    import org.joe_e.array.IntArray;
020    import org.joe_e.array.LongArray;
021    import org.joe_e.array.PowerlessArray;
022    import org.joe_e.array.ShortArray;
023    import org.ref_send.promise.Deferred;
024    import org.ref_send.promise.Eventual;
025    import org.ref_send.promise.Promise;
026    import org.ref_send.promise.Receiver;
027    import org.ref_send.promise.Vat;
028    
029    /**
030     * A {@link Wall} implementation.
031     */
032    public final class
033    Bounce {
034        private Bounce() {}
035    
036        /**
037         * Constructs an instance.
038         * @param _ eventual operator
039         */
040        static public Wall
041        make(final Eventual _) {
042            final Deferred<Boolean> d = _.defer();
043            final Receiver<Boolean> normal = d.resolver;
044            final Promise<Boolean> p = ref(false);
045            class WallX extends Struct implements Wall, Serializable {
046                static private final long serialVersionUID = 1L;
047    
048                public Promise<ConstArray<AllTypes>>
049                getAll() {
050                    return ref(ConstArray.array(new AllTypes(
051                        BooleanArray.array(true, false),
052                        CharArray.array('a', '\"', '\\', '<', '>', '/', '\b',
053                                        '\f', '\n', '\r', '\t', '\u0085'),
054                        FloatArray.array(0.0F,
055                              Float.MAX_VALUE, Float.MIN_VALUE,
056                              -Float.MAX_VALUE, -Float.MIN_VALUE,
057                              Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY,
058                              Float.NaN),
059                        DoubleArray.array(0.0,
060                              Double.MAX_VALUE, Double.MIN_VALUE,
061                              -Double.MAX_VALUE, -Double.MIN_VALUE,
062                              Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY,
063                              Double.NaN),
064                        ByteArray.array((byte)0, Byte.MAX_VALUE, Byte.MIN_VALUE),
065                        ShortArray.array((short)0, Short.MAX_VALUE,Short.MIN_VALUE),
066                        IntArray.array(0, Integer.MAX_VALUE, Integer.MIN_VALUE),
067                        LongArray.array(0L, 1L << 53, -(1L << 53)),
068                        "a \" \\ / </ < > \b \f \n \r \t \u0085",
069                        ConstArray.array(normal, null),
070                        ConstArray.array(d.promise, p),
071                        ConstArray.array(new Vat<Deferred<?>>(d, normal)),
072                        ConstArray.array(
073                            ImmutableArray.array(PowerlessArray.array(true)),
074                            10,
075                            BigInteger.TEN,
076                            new BigDecimal("3.14")
077                        ))));
078                }
079    
080                public <A> Promise<A>
081                bounce(final A a) { return ref(a); }
082    
083                public Promise<Integer>
084                sum(int... num) {
085                    int total = 0;
086                    for (int a : num) {
087                        total += a;
088                    }
089                    return ref(total);
090                }
091            }
092            return new WallX();
093        }
094    }