diff options
Diffstat (limited to '')
| -rw-r--r-- | lib/Utilities.ml | 11 | ||||
| -rw-r--r-- | lib/Utilities.mli | 2 |
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/Utilities.ml b/lib/Utilities.ml index c16be2e..b7fe364 100644 --- a/lib/Utilities.ml +++ b/lib/Utilities.ml @@ -21,6 +21,7 @@ module type SEQUENCE = sig val empty : 'a t val cons : 'a -> 'a t -> 'a t val fold : ('a -> 'b -> 'b) -> 'a t -> 'b -> 'b + val fold_left : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b end module Generic (S : SEQUENCE) = struct @@ -32,6 +33,14 @@ module Generic (S : SEQUENCE) = struct let* m = m in Ok (S.cons m acc) ) ms (Ok S.empty) + + let fold_left f init ms = + let open Result in + S.fold_left + (fun acc m -> + let* acc = acc in + f acc m ) + (Ok init) ms end module List = struct @@ -41,6 +50,7 @@ module List = struct let empty = [] let cons x xs = x :: xs let fold = List.fold_right + let fold_left = List.fold_left end include Generic (ListSequence) @@ -55,6 +65,7 @@ module FingerTree = struct let empty = BatFingerTree.empty let cons x xs = BatFingerTree.cons xs x let fold f xs acc = BatFingerTree.fold_right (Fun.flip f) acc xs + let fold_left = BatFingerTree.fold_left end include Generic (FingerTreeSequence) diff --git a/lib/Utilities.mli b/lib/Utilities.mli index 4ab7674..59bc1fc 100644 --- a/lib/Utilities.mli +++ b/lib/Utilities.mli @@ -11,6 +11,7 @@ end module List : sig val sequence : ('a, 'b) result list -> ('a list, 'b) result + val fold_left : ('a -> 'b -> ('a, 'e) result) -> 'a -> 'b list -> ('a, 'e) result val hd_opt : 'a list -> 'a option end @@ -31,6 +32,7 @@ module FingerTree : sig val map2 : ('a -> 'b -> 'c) -> 'a BatFingerTree.t -> 'b BatFingerTree.t -> 'c BatFingerTree.t val zip : 'a BatFingerTree.t -> 'b BatFingerTree.t -> ('a * 'b) BatFingerTree.t val sequence : ('a, 'b) result BatFingerTree.t -> ('a BatFingerTree.t, 'b) result + val fold_left : ('a -> 'b -> ('a, 'e) result) -> 'a -> 'b BatFingerTree.t -> ('a, 'e) result val join : string BatFingerTree.t -> string -> string end |
