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.serial;
004
005 import org.ref_send.promise.Promise;
006
007 /**
008 * An infinite series of elements.
009 * <p>
010 * A series is a FIFO list of values where the values can be removed from the
011 * list before they have been added. An invocation of {@link #consume} returns
012 * a promise for what will be the next element in the list, once it is added, at
013 * which time it will already have been removed. ;)
014 * </p>
015 * @param <T> value type
016 */
017 public interface
018 Series<T> extends Iterable<Promise<T>> {
019
020 /**
021 * Gets the front element.
022 */
023 Element<T> getFront();
024
025 /**
026 * Appends a value to the end of the series.
027 * @param value value to append
028 */
029 void produce(Promise<T> value);
030
031 /**
032 * Removes the first element in the series.
033 * @return value of the removed element
034 */
035 Promise<T> consume();
036 }