From 15a0b9dd30e6c9cb028c9a399d63d0619d1ae0f9 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Thu, 7 Aug 2014 12:25:54 +0200 Subject: [PATCH 1/3] fix release numbers --- _oasis | 2 +- sequence.mli | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/_oasis b/_oasis index 3e48dbe..e8e1479 100644 --- a/_oasis +++ b/_oasis @@ -1,6 +1,6 @@ OASISFormat: 0.4 Name: sequence -Version: 0.5 +Version: dev Homepage: https://github.com/c-cube/sequence Authors: Simon Cruanes License: BSD-2-clause diff --git a/sequence.mli b/sequence.mli index e81a729..5397de7 100644 --- a/sequence.mli +++ b/sequence.mli @@ -256,12 +256,12 @@ val min : ?lt:('a -> 'a -> bool) -> 'a t -> 'a option val head : 'a t -> 'a option (** First element, if any, otherwise [None] - @since NEXT_RELEASE *) + @since 0.5.1 *) val head_exn : 'a t -> 'a (** First element, if any, fails @raise Invalid_argument if the sequence is empty - @since NEXT_RELEASE *) + @since 0.5.1 *) val take : int -> 'a t -> 'a t (** Take at most [n] elements from the sequence. Works on infinite @@ -321,12 +321,12 @@ val of_list : 'a list -> 'a t val on_list : ('a t -> 'b t) -> 'a list -> 'b list (** [on_list f l] is equivalent to [to_list @@ f @@ of_list l]. - @since NEXT_RELEASE + @since 0.5.2 *) val to_opt : 'a t -> 'a option (** Alias to {!head} - @since NEXT_RELEASE *) + @since 0.5.1 *) val to_array : 'a t -> 'a array (** Convert to an array. Currently not very efficient because @@ -345,7 +345,7 @@ val array_slice : 'a array -> int -> int -> 'a t val of_opt : 'a option -> 'a t (** Iterate on 0 or 1 values. - @since NEXT_RELEASE *) + @since 0.5.1 *) val of_stream : 'a Stream.t -> 'a t (** Sequence of elements of a stream (usable only once) *) @@ -558,7 +558,13 @@ By chunks of [4096] bytes: Sequence.IO.(chunks_of ~size:4096 "a" |> write_to "b");; ]} -@since NEXT_RELEASE *) +Read the lines of a file into a list: + +{[ + Sequence.IO.lines "a" |> Sequence.to_list +]} + +@since 0.5.1 *) module IO : sig val lines_of : ?mode:int -> ?flags:open_flag list -> From d95495dc1233a0c9a98dc6f06d8916a92a6a7b63 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Thu, 30 Oct 2014 01:33:43 +0100 Subject: [PATCH 2/3] sequence.bigarray --- .ocamlinit | 8 +++++-- _oasis | 13 ++++++++++ bigarray/sequenceBigarray.ml | 45 +++++++++++++++++++++++++++++++++++ bigarray/sequenceBigarray.mli | 34 ++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 bigarray/sequenceBigarray.ml create mode 100644 bigarray/sequenceBigarray.mli diff --git a/.ocamlinit b/.ocamlinit index b54780c..7123b8d 100644 --- a/.ocamlinit +++ b/.ocamlinit @@ -1,5 +1,9 @@ #directory "_build";; #load "sequence.cma";; + open Sequence.Infix;; -(* vim:syntax=ocaml -*) + +#directory "_build/bigarray/";; +#load "bigarray.cma";; + +(* vim:syntax=ocaml *) diff --git a/_oasis b/_oasis index e8e1479..da48cfe 100644 --- a/_oasis +++ b/_oasis @@ -23,6 +23,10 @@ Flag invert Description: build sequence.invert (requires Delimcc) Default: false +Flag bigarray + Description: build sequence.bigarray (requires bigarray) + Default: true + Library "sequence" Path: . Modules: Sequence @@ -36,6 +40,15 @@ Library "invert" FindlibParent: sequence BuildDepends: sequence,delimcc +Library "bigarray" + Path: bigarray + Build$: flag(bigarray) + Install$: flag(bigarray) + Modules: SequenceBigarray + FindlibName: bigarray + FindlibParent: sequence + BuildDepends: sequence,bigarray + Document sequence Title: Sequence docs Type: ocamlbuild (0.3) diff --git a/bigarray/sequenceBigarray.ml b/bigarray/sequenceBigarray.ml new file mode 100644 index 0000000..fd61b86 --- /dev/null +++ b/bigarray/sequenceBigarray.ml @@ -0,0 +1,45 @@ +(* +Copyright (c) 2014, Simon Cruanes +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. Redistributions in binary +form must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*) + +(** {1 Interface and Helpers for bigarrays} *) + +let of_bigarray b yield = + let len = Bigarray.Array1.dim b in + for i=0 to len-1 do + yield b.{i} + done + +let mmap filename = + fun yield -> + let fd = Unix.openfile filename [Unix.O_RDONLY] 0 in + let len = Unix.lseek fd 0 Unix.SEEK_END in + let _ = Unix.lseek fd 0 Unix.SEEK_SET in + let b = Bigarray.Array1.map_file fd Bigarray.Char Bigarray.C_layout false len in + try + of_bigarray b yield; + Unix.close fd + with e -> + Unix.close fd; + raise e diff --git a/bigarray/sequenceBigarray.mli b/bigarray/sequenceBigarray.mli new file mode 100644 index 0000000..f7de183 --- /dev/null +++ b/bigarray/sequenceBigarray.mli @@ -0,0 +1,34 @@ +(* +Copyright (c) 2014, Simon Cruanes +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. Redistributions in binary +form must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*) + +(** {1 Interface and Helpers for bigarrays} + +@since NEXT_RELEASE *) + +val of_bigarray : ('a, _, _) Bigarray.Array1.t -> 'a Sequence.t +(** Iterate on the elements of a 1-D array *) + +val mmap : string -> char Sequence.t +(** Map the file into memory, and read the characters. *) From 0de04d0eb898db04f11398cc7687f93b2af72376 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Tue, 4 Nov 2014 21:45:01 +0100 Subject: [PATCH 3/3] depend on bytes; compliant with -safe-string --- .merlin | 1 + _oasis | 1 + _tags | 1 + sequence.ml | 15 +++++++++++---- sequence.mli | 10 ++++++++-- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.merlin b/.merlin index 385d469..d904327 100644 --- a/.merlin +++ b/.merlin @@ -6,3 +6,4 @@ B _build/tests/ B _build/bench/ PKG oUnit PKG benchmark +FLAG -safe-string diff --git a/_oasis b/_oasis index da48cfe..b84e725 100644 --- a/_oasis +++ b/_oasis @@ -30,6 +30,7 @@ Flag bigarray Library "sequence" Path: . Modules: Sequence + BuildDepends: bytes Library "invert" Path: invert diff --git a/_tags b/_tags index 5715982..45a0bee 100644 --- a/_tags +++ b/_tags @@ -28,3 +28,4 @@ : use_sequence # OASIS_STOP true: bin_annot +true: safe_string diff --git a/sequence.ml b/sequence.ml index 00dd7cd..e6d3ca5 100644 --- a/sequence.ml +++ b/sequence.ml @@ -751,7 +751,7 @@ module IO = struct fun k -> let ic = open_in_gen flags mode filename in try - let buf = String.create size in + let buf = Bytes.create size in let n = ref 0 in let stop = ref false in while not !stop do @@ -763,7 +763,7 @@ module IO = struct if n' = 0 then stop := true else n := !n + n'; done; if !n > 0 - then k (String.sub buf 0 !n) + then k (Bytes.sub_string buf 0 !n) done; close_in ic with e -> @@ -773,12 +773,19 @@ module IO = struct let write_to ?(mode=0o644) ?(flags=[Open_creat;Open_wronly]) filename seq = let oc = open_out_gen flags mode filename in try - seq (fun s -> output oc s 0 (String.length s)); + seq (fun s -> output oc s 0 (Bytes.length s)); close_out oc with e -> close_out oc; raise e + let write_str_to ?mode ?flags filename seq = + write_to ?mode ?flags filename (map Bytes.unsafe_of_string seq) + let write_lines ?mode ?flags filename seq = - write_to ?mode ?flags filename (snoc (intersperse "\n" seq) "\n") + let ret = Bytes.unsafe_of_string "\n" in + write_to ?mode ?flags filename (snoc (intersperse ret seq) ret) + + let write_str_lines ?mode ?flags filename seq = + write_lines ?mode ?flags filename (map Bytes.unsafe_of_string seq) end diff --git a/sequence.mli b/sequence.mli index 5397de7..7664060 100644 --- a/sequence.mli +++ b/sequence.mli @@ -586,13 +586,19 @@ module IO : sig different iterations might return different results *) val write_to : ?mode:int -> ?flags:open_flag list -> - string -> string t -> unit + string -> Bytes.t t -> unit (** [write_to filename seq] writes all strings from [seq] into the given file. It takes care of opening and closing the file. @param mode default [0o644] @param flags used by [open_out_gen]. Default: [[Open_creat;Open_wronly]]. *) + val write_str_to : ?mode:int -> ?flags:open_flag list -> + string -> string t -> unit + val write_lines : ?mode:int -> ?flags:open_flag list -> - string -> string t -> unit + string -> Bytes.t t -> unit (** Same as {!write_to}, but intercales ['\n'] between each string *) + + val write_str_lines : ?mode:int -> ?flags:open_flag list -> + string -> string t -> unit end