Source file resource.ml

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
27
28
29
30
31
32
33
open! Core_kernel
open! Async_kernel
open! Import
open! Eager_deferred.Use
include Resource_intf

module Make_simple (R : Simple) = struct
  module Key = R.Key
  module Common_args = R.Common_args

  type resource = R.t

  type t =
    { underlying : R.t
    ; close : unit Lazy_deferred.t
    }

  let underlying t = t.underlying

  let open_ key common_args =
    let open Deferred.Or_error.Let_syntax in
    let%map underlying =
      Monitor.try_with_join_or_error
        ~name:(sprintf !"opening resource [%{sexp:Key.t}]" key)
        (fun () -> R.open_ key common_args)
    in
    { underlying; close = Lazy_deferred.create (fun () -> R.close underlying) }
  ;;

  let has_close_started t = Lazy_deferred.is_forced t.close
  let close t = Lazy_deferred.force_exn t.close
  let close_finished t = Lazy_deferred.wait_exn t.close
end