aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/util.ml8
-rw-r--r--lib/util.mli1
2 files changed, 9 insertions, 0 deletions
diff --git a/lib/util.ml b/lib/util.ml
index 7e59d1474c..1d1c5e060b 100644
--- a/lib/util.ml
+++ b/lib/util.ml
@@ -378,6 +378,14 @@ let rec list_split3 = function
| (x,y,z)::l ->
let (rx, ry, rz) = list_split3 l in (x::rx, y::ry, z::rz)
+let rec list_insert_in_class f a = function
+ | [] -> [[a]]
+ | (b::_ as l)::classes when f a b -> (a::l)::classes
+ | l::classes -> l :: list_insert_in_class f a classes
+
+let list_partition_by f l =
+ List.fold_right (list_insert_in_class f) l []
+
let list_firstn n l =
let rec aux acc = function
| (0, l) -> List.rev acc
diff --git a/lib/util.mli b/lib/util.mli
index 986c8e31a0..6d6d9c2a85 100644
--- a/lib/util.mli
+++ b/lib/util.mli
@@ -125,6 +125,7 @@ val list_merge_uniq : ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list
val list_subset : 'a list -> 'a list -> bool
val list_splitby : ('a -> bool) -> 'a list -> 'a list * 'a list
val list_split3 : ('a * 'b * 'c) list -> 'a list * 'b list * 'c list
+val list_partition_by : ('a -> 'a -> bool) -> 'a list -> 'a list list
val list_firstn : int -> 'a list -> 'a list
val list_last : 'a list -> 'a
val list_lastn : int -> 'a list -> 'a list