From d338ce279c2917247d87a9e3e438447163c83a45 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Fri, 20 Feb 2015 18:19:18 +0100 Subject: [PATCH] Lwt_pipe: conversion to/from lwt_klist --- src/lwt/lwt_pipe.ml | 22 ++++++++++++++++++++++ src/lwt/lwt_pipe.mli | 7 +++++++ 2 files changed, 29 insertions(+) diff --git a/src/lwt/lwt_pipe.ml b/src/lwt/lwt_pipe.ml index 368ef67b..b7c24a17 100644 --- a/src/lwt/lwt_pipe.ml +++ b/src/lwt/lwt_pipe.ml @@ -303,6 +303,8 @@ end (** {2 Conversions} *) +type 'a lwt_klist = [ `Nil | `Cons of 'a * 'a lwt_klist ] Lwt.t + let of_list l : _ Reader.t = let p = create ~max_size:0 () in keep p (Lwt_list.iter_s (write p) l >>= fun () -> close p); @@ -332,6 +334,17 @@ let of_string a = keep p (send 0); p +let of_lwt_klist l = + let p = create ~max_size:0 () in + let rec next l = + l >>= function + | `Nil -> close p + | `Cons (x, tl) -> + write p x >>= fun () -> next tl + in + keep p (next l); + p + let to_list_rev r = Reader.fold ~f:(fun acc x -> x :: acc) ~x:[] r @@ -361,6 +374,15 @@ let join_strings ?sep r = let buf = Buffer.create 128 in to_buffer_str ?sep buf r >>>= fun () -> LwtErr.return (Buffer.contents buf) +let to_lwt_klist r = + let rec next () = + read r >>= function + | `End -> Lwt.return `Nil + | `Error _ -> Lwt.return `Nil + | `Ok x -> Lwt.return (`Cons (x, next ())) + in + next () + (** {2 Basic IO wrappers} *) module IO = struct diff --git a/src/lwt/lwt_pipe.mli b/src/lwt/lwt_pipe.mli index 2c9cdcec..efcd0bee 100644 --- a/src/lwt/lwt_pipe.mli +++ b/src/lwt/lwt_pipe.mli @@ -164,12 +164,16 @@ end (** {2 Conversions} *) +type 'a lwt_klist = [ `Nil | `Cons of 'a * 'a lwt_klist ] Lwt.t + val of_list : 'a list -> 'a Reader.t val of_array : 'a array -> 'a Reader.t val of_string : string -> char Reader.t +val of_lwt_klist : 'a lwt_klist -> 'a Reader.t + val to_list_rev : ('a,[>`r]) t -> 'a list LwtErr.t val to_list : ('a,[>`r]) t -> 'a list LwtErr.t @@ -186,6 +190,9 @@ val to_string : (char, [>`r]) t -> string LwtErr.t val join_strings : ?sep:string -> (string, [>`r]) t -> string LwtErr.t +val to_lwt_klist : 'a Reader.t -> 'a lwt_klist +(** Iterates on the reader. Errors are ignored (but stop the list). *) + (** {2 Basic IO wrappers} *) module IO : sig