001 // Copyright 2008 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.trace; 004 005 import java.io.Serializable; 006 007 import org.joe_e.Struct; 008 import org.ref_send.log.Anchor; 009 import org.ref_send.log.Turn; 010 import org.ref_send.promise.Receiver; 011 012 /** 013 * An event loop turn counter. 014 */ 015 public class 016 TurnCounter extends Struct implements Serializable { 017 static private final long serialVersionUID = 1L; 018 019 /** 020 * URI for the event loop 021 */ 022 public final String loop; 023 024 /** 025 * increment the turn counter 026 */ 027 public final Receiver<?> flip; 028 029 /** 030 * increment the anchor counter 031 */ 032 public final Marker mark; 033 034 private 035 TurnCounter(final String loop, final Receiver<?> flip, final Marker mark) { 036 this.loop = loop; 037 this.flip = flip; 038 this.mark = mark; 039 } 040 041 /** 042 * Constructs an instance. 043 * @param loop {@link #loop} 044 */ 045 static public TurnCounter 046 make(final String loop) { 047 class State implements Serializable { 048 static private final long serialVersionUID = 1L; 049 050 long turns = 1; // id of current turn 051 long anchors = 1; // id of next anchor 052 } 053 final State m = new State(); 054 class Flip extends Struct implements Receiver<Object>, Serializable { 055 static private final long serialVersionUID = 1L; 056 057 public void 058 apply(final Object ignored) { 059 m.turns += 1; 060 m.anchors = 1; 061 } 062 } 063 class Mark extends Struct implements Marker, Serializable { 064 static private final long serialVersionUID = 1L; 065 066 public Anchor 067 apply() { return new Anchor(new Turn(loop, m.turns), m.anchors++); } 068 } 069 return new TurnCounter(loop, new Flip(), new Mark()); 070 } 071 }