src/Pure/RAW/single_assignment_polyml.ML
author Manuel Eberl <eberlm@in.tum.de>
Tue, 19 Jan 2016 11:19:25 +0100
changeset 62201 eca7b38c8ee5
parent 61925 ab52f183f020
permissions -rw-r--r--
Added approximation of powr to NEWS/CONTRIBUTORS

(*  Title:      Pure/RAW/single_assignment_polyml.ML
    Author:     Makarius

References with single assignment.  Unsynchronized!  Emulates
structure SingleAssignment from Poly/ML 5.4.
*)

signature SINGLE_ASSIGNMENT =
sig
  type 'a saref
  exception Locked
  val saref: unit -> 'a saref
  val savalue: 'a saref -> 'a option
  val saset: 'a saref * 'a -> unit
end;

structure SingleAssignment: SINGLE_ASSIGNMENT =
struct

exception Locked;

abstype 'a saref = SARef of 'a option ref
with

fun saref () = SARef (ref NONE);

fun savalue (SARef r) = ! r;

fun saset (SARef (r as ref NONE), x) =
      (r := SOME x; RunCall.run_call1 RuntimeCalls.POLY_SYS_lockseg r)
  | saset _ = raise Locked;

end;

end;