CCString.fold

This commit is contained in:
Simon Cruanes 2014-12-19 09:55:19 +01:00
parent ed9f874d4e
commit 8c0670155d
2 changed files with 25 additions and 0 deletions

View file

@ -38,6 +38,8 @@ module type S = sig
val blit : t -> int -> t -> int -> int -> unit val blit : t -> int -> t -> int -> int -> unit
(** See {!String.blit} *) (** See {!String.blit} *)
val fold : ('a -> char -> 'a) -> 'a -> t -> 'a
(** {2 Conversions} *) (** {2 Conversions} *)
val to_gen : t -> char gen val to_gen : t -> char gen
@ -195,6 +197,12 @@ let suffix ~suf s =
let blit = String.blit let blit = String.blit
let fold f acc s =
let rec fold_rec f acc s i =
if i = String.length s then acc
else fold_rec f (f acc s.[i]) s (i+1)
in fold_rec f acc s 0
let _to_gen s i0 len = let _to_gen s i0 len =
let i = ref i0 in let i = ref i0 in
fun () -> fun () ->
@ -286,6 +294,12 @@ module Sub = struct
if o1+len>len1 || o2+len>len2 then invalid_arg "CCString.Sub.blit"; if o1+len>len1 || o2+len>len2 then invalid_arg "CCString.Sub.blit";
String.blit a1 (i1+o1) a2 (i2+o2) len String.blit a1 (i1+o1) a2 (i2+o2) len
let fold f acc (s,i,len) =
let rec fold_rec f acc s i j =
if i = j then acc
else fold_rec f (f acc s.[i]) s (i+1) j
in fold_rec f acc s i (i+len)
let to_gen (s,i,len) = _to_gen s i len let to_gen (s,i,len) = _to_gen s i len
let to_seq (s,i,len) k = let to_seq (s,i,len) k =
for i=i to i+len-1 do k s.[i] done for i=i to i+len-1 do k s.[i] done

View file

@ -43,6 +43,10 @@ module type S = sig
val blit : t -> int -> t -> int -> int -> unit val blit : t -> int -> t -> int -> int -> unit
(** See {!String.blit} *) (** See {!String.blit} *)
val fold : ('a -> char -> 'a) -> 'a -> t -> 'a
(** Fold on chars by increasing index.
@since NEXT_RELEASE *)
(** {2 Conversions} *) (** {2 Conversions} *)
val to_gen : t -> char gen val to_gen : t -> char gen
@ -169,4 +173,11 @@ module Sub : sig
(** Sub-slice *) (** Sub-slice *)
include S with type t := t include S with type t := t
(*$T
let s = Sub.make "abcde" 1 3 in \
Sub.fold (fun acc x -> x::acc) [] s = ['d'; 'c'; 'b']
Sub.make "abcde" 1 3 |> Sub.copy = "bcd"
Sub.full "abcde" |> Sub.copy = "abcde"
*)
end end