12345678910111213141516171819202122232425262728293031323334openCoreopenAsyncopenImportmoduleInet_of_fd=Internal.Inet_of_fdtypet={reader:Reader.t;writer:Writer.t}[@@derivingfields]letcreate~reader~writer=letopenOr_error.Let_syntaxin(* to_int_exn will raise if fd is already closed, which is exactly what we want *)let%bindreader_fd_int=Or_error.try_with(fun()->Reader.fdreader|>Fd.to_int_exn)inlet%bindwriter_fd_int=Or_error.try_with(fun()->Writer.fdwriter|>Fd.to_int_exn)inifreader_fd_int<>writer_fd_intthenOr_error.error_s[%message"Reader and writer have different fds"(reader_fd_int:int)(writer_fd_int:int)]elseOk{reader;writer};;letwrite_bin_prot_exn(t:t)=Writer.write_bin_prott.writerletread_bin_prot(t:t)=Reader.read_bin_prott.readerletinfot=Reader.fdt.reader|>Fd.infoletlocal_inett=Inet_of_fd.local_exn(Writer.fdt.writer)letremote_inett=Inet_of_fd.remote_exn(Writer.fdt.writer)letpeek_bin_prott=Reader.peek_bin_prott.reader