let with_sys_chdir : (string, dir_abstract) withres =
      {
        cons =
          (fun new_dir ->
             M.catch
               (fun () ->
                  let old_dir = Sys.getcwd () in
                  let () = Sys.chdir new_dir in M.return old_dir)
               M.error);
        fin =
          (fun old_dir ->
             M.catch (fun () -> M.return (Sys.chdir old_dir)) M.error);
      }