mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
CCString.fold
This commit is contained in:
parent
ed9f874d4e
commit
8c0670155d
2 changed files with 25 additions and 0 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue