diff --git a/src/core/CCString.cppo.ml b/src/core/CCString.cppo.ml index 2fd5639d..097cd078 100644 --- a/src/core/CCString.cppo.ml +++ b/src/core/CCString.cppo.ml @@ -38,6 +38,8 @@ module type S = sig val blit : t -> int -> t -> int -> int -> unit (** See {!String.blit} *) + val fold : ('a -> char -> 'a) -> 'a -> t -> 'a + (** {2 Conversions} *) val to_gen : t -> char gen @@ -195,6 +197,12 @@ let suffix ~suf s = 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 i = ref i0 in fun () -> @@ -286,6 +294,12 @@ module Sub = struct if o1+len>len1 || o2+len>len2 then invalid_arg "CCString.Sub.blit"; 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_seq (s,i,len) k = for i=i to i+len-1 do k s.[i] done diff --git a/src/core/CCString.mli b/src/core/CCString.mli index 9e6f7e98..6a0e4e63 100644 --- a/src/core/CCString.mli +++ b/src/core/CCString.mli @@ -43,6 +43,10 @@ module type S = sig val blit : t -> int -> t -> int -> int -> unit (** See {!String.blit} *) + val fold : ('a -> char -> 'a) -> 'a -> t -> 'a + (** Fold on chars by increasing index. + @since NEXT_RELEASE *) + (** {2 Conversions} *) val to_gen : t -> char gen @@ -169,4 +173,11 @@ module Sub : sig (** Sub-slice *) 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