src/Pure/Concurrent/volatile.scala
author wenzelm
Sun, 26 Feb 2012 19:36:35 +0100
changeset 47559 7e47ae85e161
parent 46548 cd41e3903fbf
child 47583 8650d9a95736
permissions -rw-r--r--
tuned signature (in accordance with ML);
wenzelm@39098
     1
/*  Title:      Pure/Concurrent/volatile.scala
wenzelm@46548
     2
    Module:     PIDE
wenzelm@39098
     3
    Author:     Makarius
wenzelm@39098
     4
wenzelm@39098
     5
Volatile variables.
wenzelm@39098
     6
*/
wenzelm@39098
     7
wenzelm@39098
     8
package isabelle
wenzelm@39098
     9
wenzelm@39098
    10
wenzelm@46119
    11
object Volatile
wenzelm@46119
    12
{
wenzelm@46119
    13
  def apply[A](init: A): Volatile[A] = new Volatile(init)
wenzelm@46119
    14
}
wenzelm@46119
    15
wenzelm@46119
    16
wenzelm@46119
    17
class Volatile[A] private(init: A)
wenzelm@39098
    18
{
wenzelm@39098
    19
  @volatile private var state: A = init
wenzelm@44601
    20
  def apply(): A = state
wenzelm@47559
    21
  def >> (f: A => A) { state = f(state) }
wenzelm@47559
    22
  def >>>[B] (f: A => (B, A)): B =
wenzelm@39098
    23
  {
wenzelm@39098
    24
    val (result, new_state) = f(state)
wenzelm@39098
    25
    state = new_state
wenzelm@39098
    26
    result
wenzelm@39098
    27
  }
wenzelm@39098
    28
}
wenzelm@39098
    29