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