(* Copyright (c) 2013, 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. *) (** {2 Transient iterators, that abstract on a finite sequence of elements.} *) type 'a t (** Sequence abstract iterator type *) (** {2 Build a sequence} *) val from_iter : (('a -> unit) -> unit) -> 'a t (** Build a sequence from a iter function *) val singleton : 'a -> 'a t (** Singleton sequence *) (** {2 Use a sequence} *) val iter : ('a -> unit) -> 'a t -> unit (** Consume the sequence, passing all its arguments to the function *) val iteri : (int -> 'a -> unit) -> 'a t -> unit (** Iterate on elements and their index in the sequence *) val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b (** Fold over elements of the sequence, consuming it *) val map : ('a -> 'b) -> 'a t -> 'b t (** Map objects of the sequence into other elements, lazily *) val filter : ('a -> bool) -> 'a t -> 'a t (** Filter on elements of the sequence *) val append : 'a t -> 'a t -> 'a t (** Append two sequences *) val concat : 'a t t -> 'a t (** Concatenate a sequence of sequences into one sequence *) val take : int -> 'a t -> 'a t (** Take at most [n] elements from the sequence *) val drop : int -> 'a t -> 'a t (** Drop the [n] first elements of the sequence *) val rev : 'a t -> 'a t (** Reverse the sequence. O(n) memory. *) val for_all : ('a -> bool) -> 'a t -> bool (** Do all elements satisfy the predicate? *) val exists : ('a -> bool) -> 'a t -> bool (** Exists there some element satisfying the predicate? *) (** {2 Basic data structures converters} *) module List : sig val of_seq : 'a t -> 'a list val to_seq : 'a list -> 'a t end module Hashtbl : sig val of_seq : ('a * 'b) t -> ('a, 'b) Hashtbl.t val to_seq : ('a, 'b) Hashtbl.t -> ('a * 'b) t end (** Iterate on ranges of ints *) module Int : sig val range : start:int -> stop:int -> int t (** Iterator on [start...stop] by steps 1 *) end