[m-rev.] diff: add cc_multi versions of higher-order map predicates

Julien Fischer jfischer at opturion.com
Tue Dec 2 16:43:33 AEDT 2025


Aside from the NEWS entries, this doesn't require review.

------------------------------

Add cc_multi versions of higher-order map predicates.

library/map.m:
library/tree234.m:
    Add cc_multi versions of some of the higher-order predicates in these
    modules.

    Re-order of mode declarations where they are inconsistent with our usual
    ordering.

NEWS.md:
    Announce the above additions.

Julien.

diff --git a/NEWS.md b/NEWS.md
index 2825bb46c..777c9bbac 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -670,6 +670,9 @@ Changes to the Mercury standard library
     - pred `compose_maps/3`
     - pred `sorted_keys_match/2`

+* We have added `cc_multi` versions of many of the higher-order predicates in
+  this module
+
 ### Changes to the `mercury_term_lexer` module

 * The representation type of the tokens returned has been tightened.
@@ -1310,6 +1313,9 @@ Changes to the Mercury standard library
     - func `tree234_to_doc/1`
                             (replacement: `pretty_printer.tree234_to_doc/1`)

+* We have added `cc_multi` versions of many of the higher-order predicates in
+  this module
+
 ### Changes to the `tree_bitset` module

 * The following obsolete predicate has been removed:
diff --git a/library/map.m b/library/map.m
index ed291a15b..839c4a4f5 100644
--- a/library/map.m
+++ b/library/map.m
@@ -1100,6 +1100,12 @@ semidet),
     mdi, muo) is semidet.
 :- mode map_foldl(in(pred(in, in, out, di, uo) is semidet), in, out,
     di, uo) is semidet.
+:- mode map_foldl(in(pred(in, in, out, in, out) is cc_multi), in, out, in, out)
+    is cc_multi.
+:- mode map_foldl(in(pred(in, in, out, mdi, muo) is cc_multi), in, out,
+    mdi, muo) is cc_multi.
+:- mode map_foldl(in(pred(in, in, out, di, uo) is cc_multi), in, out, di, uo)
+    is cc_multi.

     % As map_foldl, but with two accumulators.
     %
@@ -1119,6 +1125,12 @@ semidet),
     in, out, in, out, mdi, muo) is semidet.
 :- mode map_foldl2(in(pred(in, in, out, in, out, di, uo) is semidet),
     in, out, in, out, di, uo) is semidet.
+:- mode map_foldl2(in(pred(in, in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out) is cc_multi.
+:- mode map_foldl2(in(pred(in, in, out, in, out, mdi, muo) is cc_multi),
+    in, out, in, out, mdi, muo) is cc_multi.
+:- mode map_foldl2(in(pred(in, in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, di, uo) is cc_multi.

     % As map_foldl, but with three accumulators.
     %
@@ -1148,6 +1160,15 @@ semidet),
 :- mode map_foldl3(
     in(pred(in, in, out, in, out, in, out, di, uo) is semidet),
     in, out, in, out, in, out, di, uo) is semidet.
+:- mode map_foldl3(
+    in(pred(in, in, out, in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out, in, out) is cc_multi.
+:- mode map_foldl3(
+    in(pred(in, in, out, in, out, in, out, mdi, muo) is cc_multi),
+    in, out, in, out, in, out, mdi, muo) is cc_multi.
+:- mode map_foldl3(
+    in(pred(in, in, out, di, uo, di, uo, di, uo) is cc_multi),
+    in, out, di, uo, di, uo, di, uo) is cc_multi.

     % As map_foldl, but with four accumulators.
     %
@@ -1177,6 +1198,15 @@ semidet),
 :- mode map_foldl4(in(pred(in, in, out, in, out, in, out, in, out, di, uo)
     is semidet),
     in, out, in, out, in, out, in, out, di, uo) is semidet.
+:- mode map_foldl4(in(pred(in, in, out, in, out, in, out, in, out, in, out)
+    is cc_multi),
+    in, out, in, out, in, out, in, out, in, out) is cc_multi.
+:- mode map_foldl4(in(pred(in, in, out, in, out, in, out, in, out, mdi, muo)
+    is cc_multi),
+    in, out, in, out, in, out, in, out, mdi, muo) is cc_multi.
+:- mode map_foldl4(in(pred(in, in, out, in, out, di, uo, di, uo, di, uo)
+    is cc_multi),
+    in, out, in, out, di, uo, di, uo, di, uo) is cc_multi.

 %---------------------%

@@ -1187,88 +1217,116 @@ semidet),
     % take a key argument.
     %
 :- pred map_values_foldl(pred(V, W, A, A), map(K, V), map(K, W), A, A).
-:- mode map_values_foldl(in(pred(in, out, di, uo) is det),
-    in, out, di, uo) is det.
 :- mode map_values_foldl(in(pred(in, out, in, out) is det),
     in, out, in, out) is det.
+:- mode map_values_foldl(in(pred(in, out, di, uo) is det),
+    in, out, di, uo) is det.
 :- mode map_values_foldl(in(pred(in, out, in, out) is semidet),
     in, out, in, out) is semidet.
+:- mode map_values_foldl(in(pred(in, out, in, out) is cc_multi),
+    in, out, in, out) is cc_multi.
+:- mode map_values_foldl(in(pred(in, out, di, uo) is cc_multi),
+    in, out, di, uo) is cc_multi.

     % As map_foldl, but without passing the key to the predicate.
     %
 :- pred map_values_only_foldl(pred(V, W, A, A), map(K, V), map(K, W), A, A).
-:- mode map_values_only_foldl(in(pred(in, out, di, uo) is det),
-    in, out, di, uo) is det.
 :- mode map_values_only_foldl(in(pred(in, out, in, out) is det),
     in, out, in, out) is det.
+:- mode map_values_only_foldl(in(pred(in, out, di, uo) is det),
+    in, out, di, uo) is det.
 :- mode map_values_only_foldl(in(pred(in, out, in, out) is semidet),
     in, out, in, out) is semidet.
+:- mode map_values_only_foldl(in(pred(in, out, in, out) is cc_multi),
+    in, out, in, out) is cc_multi.
+:- mode map_values_only_foldl(in(pred(in, out, di, uo) is cc_multi),
+    in, out, di, uo) is cc_multi.

     % As map_values_only_foldl, but with two accumulators.
     %
 :- pred map_values_foldl2(pred(V, W, A, A, B, B), map(K, V), map(K, W),
     A, A, B, B).
-:- mode map_values_foldl2(in(pred(in, out, di, uo, di, uo) is det),
-    in, out, di, uo, di, uo) is det.
-:- mode map_values_foldl2(in(pred(in, out, in, out, di, uo) is det),
-    in, out, in, out, di, uo) is det.
 :- mode map_values_foldl2(in(pred(in, out, in, out, in, out) is det),
     in, out, in, out, in, out) is det.
+:- mode map_values_foldl2(in(pred(in, out, in, out, di, uo) is det),
+    in, out, in, out, di, uo) is det.
+:- mode map_values_foldl2(in(pred(in, out, di, uo, di, uo) is det),
+    in, out, di, uo, di, uo) is det.
 :- mode map_values_foldl2(in(pred(in, out, in, out, in, out) is semidet),
     in, out, in, out, in, out) is semidet.
+:- mode map_values_foldl2(in(pred(in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out) is cc_multi.
+:- mode map_values_foldl2(in(pred(in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, di, uo) is cc_multi.

     % As map_values_only_foldl, but with two accumulators.
     %
 :- pred map_values_only_foldl2(pred(V, W, A, A, B, B), map(K, V), map(K, W),
     A, A, B, B).
-:- mode map_values_only_foldl2(in(pred(in, out, di, uo, di, uo) is det),
-    in, out, di, uo, di, uo) is det.
-:- mode map_values_only_foldl2(in(pred(in, out, in, out, di, uo) is det),
-    in, out, in, out, di, uo) is det.
 :- mode map_values_only_foldl2(in(pred(in, out, in, out, in, out) is det),
     in, out, in, out, in, out) is det.
+:- mode map_values_only_foldl2(in(pred(in, out, in, out, di, uo) is det),
+    in, out, in, out, di, uo) is det.
+:- mode map_values_only_foldl2(in(pred(in, out, di, uo, di, uo) is det),
+    in, out, di, uo, di, uo) is det.
 :- mode map_values_only_foldl2(in(pred(in, out, in, out, in, out) is semidet),
     in, out, in, out, in, out) is semidet.
+:- mode map_values_only_foldl2(in(pred(in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out) is cc_multi.
+:- mode map_values_only_foldl2(in(pred(in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, di, uo) is cc_multi.

     % As map_values_only_foldl, but with three accumulators.
     %
 :- pred map_values_foldl3(pred(V, W, A, A, B, B, C, C),
     map(K, V), map(K, W), A, A, B, B, C, C).
+:- mode map_values_foldl3(
+    in(pred(in, out, in, out, in, out, in, out) is det),
+    in, out, in, out, in, out, in, out) is det.
+:- mode map_values_foldl3(
+    in(pred(in, out, in, out, in, out, di, uo) is det),
+    in, out, in, out, in, out, di, uo) is det.
 :- mode map_values_foldl3(
     in(pred(in, out, di, uo, di, uo, di, uo) is det),
     in, out, di, uo, di, uo, di, uo) is det.
 :- mode map_values_foldl3(
     in(pred(in, out, in, out, di, uo, di, uo) is det),
     in, out, in, out, di, uo, di, uo) is det.
-:- mode map_values_foldl3(
-    in(pred(in, out, in, out, in, out, di, uo) is det),
-    in, out, in, out, in, out, di, uo) is det.
-:- mode map_values_foldl3(
-    in(pred(in, out, in, out, in, out, in, out) is det),
-    in, out, in, out, in, out, in, out) is det.
 :- mode map_values_foldl3(
     in(pred(in, out, in, out, in, out, in, out) is semidet),
     in, out, in, out, in, out, in, out) is semidet.
+:- mode map_values_foldl3(
+    in(pred(in, out, in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out, in, out) is cc_multi.
+:- mode map_values_foldl3(
+    in(pred(in, out, in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, in, out, di, uo) is cc_multi.

     % As map_values_only_foldl, but with three accumulators.
     %
 :- pred map_values_only_foldl3(pred(V, W, A, A, B, B, C, C),
     map(K, V), map(K, W), A, A, B, B, C, C).
 :- mode map_values_only_foldl3(
-    in(pred(in, out, di, uo, di, uo, di, uo) is det),
-    in, out, di, uo, di, uo, di, uo) is det.
-:- mode map_values_only_foldl3(
-    in(pred(in, out, in, out, di, uo, di, uo) is det),
-    in, out, in, out, di, uo, di, uo) is det.
+    in(pred(in, out, in, out, in, out, in, out) is det),
+    in, out, in, out, in, out, in, out) is det.
 :- mode map_values_only_foldl3(
     in(pred(in, out, in, out, in, out, di, uo) is det),
     in, out, in, out, in, out, di, uo) is det.
 :- mode map_values_only_foldl3(
-    in(pred(in, out, in, out, in, out, in, out) is det),
-    in, out, in, out, in, out, in, out) is det.
+    in(pred(in, out, in, out, di, uo, di, uo) is det),
+    in, out, in, out, di, uo, di, uo) is det.
+:- mode map_values_only_foldl3(
+    in(pred(in, out, di, uo, di, uo, di, uo) is det),
+    in, out, di, uo, di, uo, di, uo) is det.
 :- mode map_values_only_foldl3(
     in(pred(in, out, in, out, in, out, in, out) is semidet),
     in, out, in, out, in, out, in, out) is semidet.
+:- mode map_values_only_foldl3(
+    in(pred(in, out, in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out, in, out) is cc_multi.
+:- mode map_values_only_foldl3(
+    in(pred(in, out, in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, in, out, di, uo) is cc_multi.

 %---------------------------------------------------------------------------%
 %---------------------------------------------------------------------------%
diff --git a/library/tree234.m b/library/tree234.m
index 14edab059..10d28df26 100644
--- a/library/tree234.m
+++ b/library/tree234.m
@@ -624,6 +624,12 @@
     in, out, mdi, muo) is semidet.
 :- mode map_foldl(in(pred(in, in, out, di, uo) is semidet),
     in, out, di, uo) is semidet.
+:- mode map_foldl(in(pred(in, in, out, in, out) is cc_multi),
+    in, out, in, out) is cc_multi.
+:- mode map_foldl(in(pred(in, in, out, mdi, muo) is cc_multi),
+    in, out, mdi, muo) is cc_multi.
+:- mode map_foldl(in(pred(in, in, out, di, uo) is cc_multi),
+    in, out, di, uo) is cc_multi.

 :- pred map_foldl2(pred(K, V, W, A, A, B, B),
     tree234(K, V), tree234(K, W), A, A, B, B).
@@ -641,6 +647,12 @@
     in, out, in, out, mdi, muo) is semidet.
 :- mode map_foldl2(in(pred(in, in, out, in, out, di, uo) is semidet),
     in, out, in, out, di, uo) is semidet.
+:- mode map_foldl2(in(pred(in, in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out) is cc_multi.
+:- mode map_foldl2(in(pred(in, in, out, in, out, mdi, muo) is cc_multi),
+    in, out, in, out, mdi, muo) is cc_multi.
+:- mode map_foldl2(in(pred(in, in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, di, uo) is cc_multi.

 :- pred map_foldl3(pred(K, V, W, A, A, B, B, C, C),
     tree234(K, V), tree234(K, W), A, A, B, B, C, C).
@@ -663,6 +675,12 @@
 :- mode map_foldl3(in(pred(in, in, out, in, out, in, out, di, uo)
     is semidet),
     in, out, in, out, in, out, di, uo) is semidet.
+:- mode map_foldl3(in(pred(in, in, out, in, out, in, out, in, out) is
cc_multi),
+    in, out, in, out, in, out, in, out) is cc_multi.
+:- mode map_foldl3(in(pred(in, in, out, in, out, in, out, mdi, muo)
is cc_multi),
+    in, out, in, out, in, out, mdi, muo) is cc_multi.
+:- mode map_foldl3(in(pred(in, in, out, di, uo, di, uo, di, uo) is cc_multi),
+    in, out, di, uo, di, uo, di, uo) is cc_multi.

 :- pred map_foldl4(pred(K, V, W, A, A, B, B, C, C, D, D),
     tree234(K, V), tree234(K, W), A, A, B, B, C, C, D, D).
@@ -690,82 +708,119 @@
 :- mode map_foldl4(
     in(pred(in, in, out, in, out, in, out, in, out, di, uo) is semidet),
     in, out, in, out, in, out, in, out, di, uo) is semidet.
+:- mode map_foldl4(
+    in(pred(in, in, out, in, out, in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out, in, out, in, out) is cc_multi.
+:- mode map_foldl4(
+    in(pred(in, in, out, in, out, in, out, in, out, mdi, muo) is cc_multi),
+    in, out, in, out, in, out, in, out, mdi, muo) is cc_multi.
+:- mode map_foldl4(
+    in(pred(in, in, out, in, out, di, uo, di, uo, di, uo) is cc_multi),
+    in, out, in, out, di, uo, di, uo, di, uo) is cc_multi.

 :- pred map_values_foldl(pred(V, W, A, A),
     tree234(K, V), tree234(K, W), A, A).
-:- mode map_values_foldl(in(pred(in, out, di, uo) is det),
-    in, out, di, uo) is det.
 :- mode map_values_foldl(in(pred(in, out, in, out) is det),
     in, out, in, out) is det.
+:- mode map_values_foldl(in(pred(in, out, di, uo) is det),
+    in, out, di, uo) is det.
 :- mode map_values_foldl(in(pred(in, out, in, out) is semidet),
     in, out, in, out) is semidet.
+:- mode map_values_foldl(in(pred(in, out, in, out) is cc_multi),
+    in, out, in, out) is cc_multi.
+:- mode map_values_foldl(in(pred(in, out, di, uo) is cc_multi),
+    in, out, di, uo) is cc_multi.

 :- pred map_values_only_foldl(pred(V, W, A, A),
     tree234(K, V), tree234(K, W), A, A).
-:- mode map_values_only_foldl(in(pred(in, out, di, uo) is det),
-    in, out, di, uo) is det.
 :- mode map_values_only_foldl(in(pred(in, out, in, out) is det),
     in, out, in, out) is det.
+:- mode map_values_only_foldl(in(pred(in, out, di, uo) is det),
+    in, out, di, uo) is det.
 :- mode map_values_only_foldl(in(pred(in, out, in, out) is semidet),
     in, out, in, out) is semidet.
+:- mode map_values_only_foldl(in(pred(in, out, in, out) is cc_multi),
+    in, out, in, out) is cc_multi.
+:- mode map_values_only_foldl(in(pred(in, out, di, uo) is cc_multi),
+    in, out, di, uo) is cc_multi.

 :- pred map_values_foldl2(pred(V, W, A, A, B, B),
     tree234(K, V), tree234(K, W), A, A, B, B).
-:- mode map_values_foldl2(in(pred(in, out, di, uo, di, uo) is det),
-    in, out, di, uo, di, uo) is det.
-:- mode map_values_foldl2(in(pred(in, out, in, out, di, uo) is det),
-    in, out, in, out, di, uo) is det.
 :- mode map_values_foldl2(in(pred(in, out, in, out, in, out) is det),
     in, out, in, out, in, out) is det.
+:- mode map_values_foldl2(in(pred(in, out, in, out, di, uo) is det),
+    in, out, in, out, di, uo) is det.
+:- mode map_values_foldl2(in(pred(in, out, di, uo, di, uo) is det),
+    in, out, di, uo, di, uo) is det.
 :- mode map_values_foldl2(in(pred(in, out, in, out, in, out) is semidet),
     in, out, in, out, in, out) is semidet.
+:- mode map_values_foldl2(in(pred(in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out) is cc_multi.
+:- mode map_values_foldl2(in(pred(in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, di, uo) is cc_multi.

 :- pred map_values_only_foldl2(pred(V, W, A, A, B, B),
     tree234(K, V), tree234(K, W), A, A, B, B).
-:- mode map_values_only_foldl2(in(pred(in, out, di, uo, di, uo) is det),
-    in, out, di, uo, di, uo) is det.
-:- mode map_values_only_foldl2(in(pred(in, out, in, out, di, uo) is det),
-    in, out, in, out, di, uo) is det.
 :- mode map_values_only_foldl2(in(pred(in, out, in, out, in, out) is det),
     in, out, in, out, in, out) is det.
+:- mode map_values_only_foldl2(in(pred(in, out, in, out, di, uo) is det),
+    in, out, in, out, di, uo) is det.
+:- mode map_values_only_foldl2(in(pred(in, out, di, uo, di, uo) is det),
+    in, out, di, uo, di, uo) is det.
 :- mode map_values_only_foldl2(in(pred(in, out, in, out, in, out) is semidet),
     in, out, in, out, in, out) is semidet.
+:- mode map_values_only_foldl2(in(pred(in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out) is cc_multi.
+:- mode map_values_only_foldl2(in(pred(in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, di, uo) is cc_multi.

 :- pred map_values_foldl3(pred(V, W, A, A, B, B, C, C),
     tree234(K, V), tree234(K, W), A, A, B, B, C, C).
 :- mode map_values_foldl3(
-    in(pred(in, out, di, uo, di, uo, di, uo) is det),
-    in, out, di, uo, di, uo, di, uo) is det.
-:- mode map_values_foldl3(
-    in(pred(in, out, in, out, di, uo, di, uo) is det),
-    in, out, in, out, di, uo, di, uo) is det.
+    in(pred(in, out, in, out, in, out, in, out) is det),
+    in, out, in, out, in, out, in, out) is det.
 :- mode map_values_foldl3(
     in(pred(in, out, in, out, in, out, di, uo) is det),
     in, out, in, out, in, out, di, uo) is det.
 :- mode map_values_foldl3(
-    in(pred(in, out, in, out, in, out, in, out) is det),
-    in, out, in, out, in, out, in, out) is det.
+    in(pred(in, out, in, out, di, uo, di, uo) is det),
+    in, out, in, out, di, uo, di, uo) is det.
+:- mode map_values_foldl3(
+    in(pred(in, out, di, uo, di, uo, di, uo) is det),
+    in, out, di, uo, di, uo, di, uo) is det.
 :- mode map_values_foldl3(
     in(pred(in, out, in, out, in, out, in, out) is semidet),
     in, out, in, out, in, out, in, out) is semidet.
+:- mode map_values_foldl3(
+    in(pred(in, out, in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out, in, out) is cc_multi.
+:- mode map_values_foldl3(
+    in(pred(in, out, in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, in, out, di, uo) is cc_multi.

 :- pred map_values_only_foldl3(pred(V, W, A, A, B, B, C, C),
     tree234(K, V), tree234(K, W), A, A, B, B, C, C).
 :- mode map_values_only_foldl3(
-    in(pred(in, out, di, uo, di, uo, di, uo) is det),
-    in, out, di, uo, di, uo, di, uo) is det.
-:- mode map_values_only_foldl3(
-    in(pred(in, out, in, out, di, uo, di, uo) is det),
-    in, out, in, out, di, uo, di, uo) is det.
+    in(pred(in, out, in, out, in, out, in, out) is det),
+    in, out, in, out, in, out, in, out) is det.
 :- mode map_values_only_foldl3(
     in(pred(in, out, in, out, in, out, di, uo) is det),
     in, out, in, out, in, out, di, uo) is det.
 :- mode map_values_only_foldl3(
-    in(pred(in, out, in, out, in, out, in, out) is det),
-    in, out, in, out, in, out, in, out) is det.
+    in(pred(in, out, in, out, di, uo, di, uo) is det),
+    in, out, in, out, di, uo, di, uo) is det.
+:- mode map_values_only_foldl3(
+    in(pred(in, out, di, uo, di, uo, di, uo) is det),
+    in, out, di, uo, di, uo, di, uo) is det.
 :- mode map_values_only_foldl3(
     in(pred(in, out, in, out, in, out, in, out) is semidet),
     in, out, in, out, in, out, in, out) is semidet.
+:- mode map_values_only_foldl3(
+    in(pred(in, out, in, out, in, out, in, out) is cc_multi),
+    in, out, in, out, in, out, in, out) is cc_multi.
+:- mode map_values_only_foldl3(
+    in(pred(in, out, in, out, in, out, di, uo) is cc_multi),
+    in, out, in, out, in, out, di, uo) is cc_multi.

 %---------------------%


More information about the reviews mailing list