package jazz.unsafe;

///////////////////////////////////////////////////////////////////////////////
//
//                        Imperative counter (use with care)
//
///////////////////////////////////////////////////////////////////////////////

public final class Counter {
  // Create a new counter
  public static create(n: int): Counter;

  // Next value
  public next(): int;

  // Private native hashtable
  table: native;
}

///////////////////////////////////////////////////////////////////////////////
//
//                               Implementation
//
///////////////////////////////////////////////////////////////////////////////

// Temporary (should be synchronized)
Counter.create(n) = (table; put; new Counter(table = table)) {
  table = native("java.util.Hashtable()");
  put = native("java.lang.Object "
               "java.util.Hashtable.put(java.lang.Object,java.lang.Object)",
               table, 0, n);
}

// Temporary (should be synchronized)
next@Counter() = (update; n)
{
  n = native("java.lang.Object "
             "java.util.Hashtable.get(java.lang.Object)",
             table, 0);
  update = native("java.lang.Object "
                  "java.util.Hashtable.put(java.lang.Object,java.lang.Object)",
                  table, 0, n + 1);
}