/** * The following class lazily generates the sequence of natural numbers. *_rest is implemented as one of two states: evaluated or unevaluated. * @author Alan Cox */ class NaturalNumbers { private int _first; private interface IState { public NaturalNumbers getRest(NaturalNumbers owner); } private static class EvaluatedState implements IState { private NaturalNumbers _successor; EvaluatedState(NaturalNumbers successor) { _successor = successor; } public NaturalNumbers getRest(NaturalNumbers owner) { return _successor; } } private static class UnevaluatedState implements IState { public final static UnevaluatedState Singleton = new UnevaluatedState(); private UnevaluatedState() { } public NaturalNumbers getRest(NaturalNumbers owner) { IState successor = new EvaluatedState(new NaturalNumbers(owner.getFirst() + 1)); owner.setSuccessor(successor); return successor.getRest(owner); } } private IState _successor; public final static NaturalNumbers Singleton = new NaturalNumbers(1); private NaturalNumbers(int first) { _first = first; _successor = UnevaluatedState.Singleton; } public final int getFirst() { return _first; } public final NaturalNumbers getSuccessor() { return _successor.getRest(this); } private final void setSuccessor(IState successor) { _successor = successor; } // Simple test code. public static void main(String args[]) { int i; NaturalNumbers n = Singleton; for (i = 0; i < 7; i++) { System.out.print(n.getFirst() + " "); n = n.getSuccessor(); } System.out.println(n.getFirst()); n = Singleton; for (i = 0; i < 11; i++) { System.out.print(n.getFirst() + " "); n = n.getSuccessor(); } System.out.println(n.getFirst()); } }