[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