nogx

demo

#OCaml #demo

module type S = sig
  type t [@@deriving show]

  val atom : t Atomic.t
  val init : unit -> unit
  val next : unit -> t
end

module type FRESH = sig
  type t [@@deriving show]

  val init : t
  val next : t -> t
end

module Make (Fresh : FRESH) : S with type t = Fresh.t = struct
  type t = Fresh.t [@@deriving show]

  let atom = 
    let value = Fresh.init in
    Atomic.make value

  let init () =
    let value = Fresh.init in
    Atomic.set atom value

  let next () =
    let value = Fresh.next @@ Atomic.get atom in
    Atomic.exchange atom value
end