[m-rev.] diff: additional folds for bags and assoc_lists.
    Julien Fischer 
    jfischer at opturion.com
       
    Fri Nov 22 16:43:47 AEDT 2013
    
    
  
Branches: master
-----------------------
Add additional fold predicates for bags and assoc_lists.
library/assoc_list.m:
 	Add foldl2_values/6.
library/bag.m:
 	Add foldl/4 and foldl2/6.
NEWS:
 	Announce the above additions.
Julien.
diff --git a/NEWS b/NEWS
index 4abef36..562e866 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,13 @@ Changes to the Mercury standard library:
  * We have added the following predicates to the list module: foldr2/6 and
    foldr3/8.
+* We have added the following predicates to the bag module: foldl/4 and
+  foldl2/6.
+
+* We have added the following predicate to the assoc_list module:
+  foldl2_values/6.
+
+
  NEWS for Mercury 13.05.2
  ------------------------
diff --git a/library/assoc_list.m b/library/assoc_list.m
index b6098ca..63d0e40 100644
--- a/library/assoc_list.m
+++ b/library/assoc_list.m
@@ -179,6 +179,27 @@
  :- mode assoc_list.foldl_values(pred(in, in, out) is nondet, in,
      in, out) is nondet.
+    % As above, but with two accumulators.
+    %
+:- pred assoc_list.foldl2_values(pred(V, A, A, B, B), assoc_list(K, V),
+    A, A, B, B).
+:- mode assoc_list.foldl2_values(pred(in, in, out, in, out) is det, in,
+    in, out, in, out) is det.
+:- mode assoc_list.foldl2_values(pred(in, in, out, mdi, muo) is det, in,
+    in, out, mdi, muo) is det.
+:- mode assoc_list.foldl2_values(pred(in, in, out, di, uo) is det, in,
+    in, out, di, uo) is det.
+:- mode assoc_list.foldl2_values(pred(in, in, out, in, out) is semidet, in,
+    in, out, in, out) is semidet.
+:- mode assoc_list.foldl2_values(pred(in, in, out, mdi, muo) is semidet, in,
+    in, out, mdi, muo) is semidet.
+:- mode assoc_list.foldl2_values(pred(in, in, out, di, uo) is semidet, in,
+    in, out, di, uo) is semidet.
+:- mode assoc_list.foldl2_values(pred(in, in, out, in, out) is multi, in,
+    in, out, in, out) is multi.
+:- mode assoc_list.foldl2_values(pred(in, in, out, in, out) is nondet, in,
+    in, out, in, out) is nondet.
+
  %-----------------------------------------------------------------------------%
  %-----------------------------------------------------------------------------%
@@ -365,6 +386,12 @@ assoc_list.foldl_values(P, [KV | KVs], !Acc) :-
      P(V, !Acc),
      assoc_list.foldl_values(P, KVs, !Acc).
+assoc_list.foldl2_values(_, [], !Acc1, !Acc2).
+assoc_list.foldl2_values(P, [KV | KVs], !Acc1, !Acc2) :-
+    KV = _K - V,
+    P(V, !Acc1, !Acc2),
+    assoc_list.foldl2_values(P, KVs, !Acc1, !Acc2).
+
  %-----------------------------------------------------------------------------%
  :- end_module assoc_list.
  %-----------------------------------------------------------------------------%
diff --git a/library/bag.m b/library/bag.m
index b950d51..8266c2f 100644
--- a/library/bag.m
+++ b/library/bag.m
@@ -243,6 +243,33 @@
  :- pred bag.subset_compare(comparison_result::out, bag(T)::in, bag(T)::in)
      is semidet.
+    % Perform a traversal of the bag, applying an accumulator predicate
+    % to each value - count pair.
+    %
+:- pred bag.foldl(pred(T, int, A, A), bag(T), A, A).
+:- mode bag.foldl(pred(in, in, in, out) is det, in, in, out) is det.
+:- mode bag.foldl(pred(in, in, mdi, muo) is det, in, mdi, muo) is det.
+:- mode bag.foldl(pred(in, in, di, uo) is det, in, di, uo) is det.
+:- mode bag.foldl(pred(in, in, in, out) is semidet, in, in, out) is semidet.
+:- mode bag.foldl(pred(in, in, mdi, muo) is semidet, in, mdi, muo) is semidet.
+:- mode bag.foldl(pred(in, in, di, uo) is semidet, in, di, uo) is semidet.
+
+    % As above, but with two accumulators.
+    %
+:- pred bag.foldl2(pred(T, int, A, A, B, B), bag(T), A, A, B, B).
+:- mode bag.foldl2(pred(in, in, in, out, in, out) is det, in, in, out,
+    in, out) is det.
+:- mode bag.foldl2(pred(in, in, in, out, mdi, muo) is det, in, in, out,
+    mdi, muo) is det.
+:- mode bag.foldl2(pred(in, in, in, out, di, uo) is det, in, in, out,
+    di, uo) is det.
+:- mode bag.foldl2(pred(in, in, in, out, in, out) is semidet, in, in, out,
+    in, out) is semidet.
+:- mode bag.foldl2(pred(in, in, in, out, mdi, muo) is semidet, in, in, out,
+    mdi, muo) is semidet.
+:- mode bag.foldl2(pred(in, in, in, out, di, uo) is semidet, in, in, out,
+    di, uo) is semidet.
+
  %---------------------------------------------------------------------------%
  %---------------------------------------------------------------------------%
@@ -628,5 +655,13 @@ bag.subset_compare(Res, bag(A), bag(B)) :-
      ).
  %-----------------------------------------------------------------------------%
+
+bag.foldl(Pred, bag(Bag), !Acc) :-
+    map.foldl(Pred, Bag, !Acc).
+
+bag.foldl2(Pred, bag(Bag), !Acc1, !Acc2) :-
+    map.foldl2(Pred, Bag, !Acc1, !Acc2).
+
+%-----------------------------------------------------------------------------%
  :- end_module bag.
  %-----------------------------------------------------------------------------%
    
    
More information about the reviews
mailing list