Skip to content

Instantly share code, notes, and snippets.

@m2ym
Created August 15, 2014 15:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save m2ym/bfadabd6db9ab7fe0705 to your computer and use it in GitHub Desktop.
Save m2ym/bfadabd6db9ab7fe0705 to your computer and use it in GitHub Desktop.
PGOCaml with Async backend
open Core.Std
open Async.Std
module type PGOCaml_async_thread =
PGOCaml_generic.THREAD
with type 'a t = 'a Deferred.t
module PGOCaml_async_thread : PGOCaml_async_thread = struct
type 'a t = 'a Deferred.t
let return = Deferred.return
let (>>=) = Deferred.(>>=)
let fail = raise
let catch f handler =
Monitor.try_with ~run:`Now ~rest:`Raise f
>>= function
| Ok x -> return x
| Error e -> handler e
type in_channel = Reader.t
type out_channel = Writer.t
let open_connection sockaddr =
begin match sockaddr with
| Core.Std.Unix.ADDR_UNIX s ->
Socket.connect
(Socket.create Socket.Type.unix)
(`Unix s)
>>| Socket.fd
| Core.Std.Unix.ADDR_INET (addr, port) ->
Socket.connect
(Socket.create Socket.Type.tcp)
(`Inet (addr, port))
>>| Socket.fd
end
>>= fun fd ->
return (Reader.create fd, Writer.create fd)
let output_char w c =
Writer.write_char w c;
return ()
let output_binary_int w n =
let buf = String.create 4 in
Binary_packing.pack_signed_32_int ~byte_order:`Big_endian ~buf ~pos:0 n;
Writer.write w buf;
return ()
let output_string w s =
Writer.write w s;
return ()
let flush w =
Writer.flushed w
let input_char r =
Reader.read_char r >>| function
| `Eof -> raise End_of_file
| `Ok c -> c
let input_binary_int r =
let buf = String.create 4 in
Reader.really_read r ~len:4 buf >>| function
| `Eof _ -> raise End_of_file
| `Ok -> Binary_packing.unpack_signed_32_int ~byte_order:`Big_endian ~buf ~pos:0
let really_input r buf pos len =
Reader.really_read r ~pos ~len buf >>| function
| `Eof _ -> raise End_of_file
| `Ok -> ()
let close_in r =
Unix.Fd.syscall_exn (Reader.fd r)
(fun file_descr -> Core.Std.Unix.shutdown file_descr Core.Std.Unix.SHUTDOWN_RECEIVE);
return ()
end
include PGOCaml_generic.Make (PGOCaml_async_thread)
@pdonadeo
Copy link

Hi, did you manage this snippet to work?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment