1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type dtor = unit -> unit
type 'a t = {
payload : ('a * ('a -> unit)) option ref;
}
let dtor payload =
match !payload with
| None -> ()
| Some (x, free) ->
payload := None;
free x
let make x free =
let payload = ref (Some (x, free)) in
let t = { payload } in
t, (fun () -> dtor payload)
let use t =
match !(t.payload) with
| Some (x, _free) -> x
| None -> invalid_arg "Resource has been destroyed"
let destroy t = dtor t.payload