From b308a8ae870d7e68609ad710e132a8a863f5f090 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Thu, 7 Mar 2013 19:30:57 +0100 Subject: [PATCH] added scan combinator --- sequence.ml | 8 ++++++++ sequence.mli | 3 +++ 2 files changed, 11 insertions(+) diff --git a/sequence.ml b/sequence.ml index fe48790..99ae6e9 100644 --- a/sequence.ml +++ b/sequence.ml @@ -226,6 +226,14 @@ let unfoldr f b = in from_iter (fun k -> unfold k b) +(** Sequence of intermediate results *) +let scan f acc seq = + from_iter + (fun k -> + k acc; + let acc = ref acc in + seq (fun elt -> let acc' = f !acc elt in k acc'; acc := acc')) + (** Max element of the sequence, using the given comparison function. A default element has to be provided. *) let max ?(lt=fun x y -> x < y) seq m = diff --git a/sequence.mli b/sequence.mli index f6ef94b..aab1f0d 100644 --- a/sequence.mli +++ b/sequence.mli @@ -119,6 +119,9 @@ val unfoldr : ('b -> ('a * 'b) option) -> 'b -> 'a t yields [Some (x,b')] then [x] is returned and unfoldr recurses with [b']. *) +val scan : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b t + (** Sequence of intermediate results *) + val max : ?lt:('a -> 'a -> bool) -> 'a t -> 'a -> 'a (** Max element of the sequence, using the given comparison function. A default element has to be provided. *)