From cd4bd74002ea77d82b38bcec9b2e661bebdfd59c Mon Sep 17 00:00:00 2001 From: Julien Fischer Date: Thu, 23 Jun 2011 03:36:10 +0000 Subject: [PATCH] Add the predicate map_fold3_maybe/9. Branches: main library/maybe.m: Add the predicate map_fold3_maybe/9. Add further modes for the other fold predicates in this module. NEWS: Announce the above changes. --- NEWS | 4 ++++ library/maybe.m | 54 +++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 2347e5255..ad8563b92 100644 --- a/NEWS +++ b/NEWS @@ -189,6 +189,10 @@ Changes to the Mercury standard library: a new array from a list with the elements of the array occurring in the reverse order to that of the list. +* We have added the predicate maybe.map_fold3_maybe/9 and also added + additional modes for maybe.fold_maybe/4, maybe.map_fold_maybe/5, + and maybe.map_fold2_maybe/7. + NEWS for Mercury 11.01 ---------------------- diff --git a/library/maybe.m b/library/maybe.m index 86eff5787..4796799bf 100644 --- a/library/maybe.m +++ b/library/maybe.m @@ -1,7 +1,7 @@ %-----------------------------------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et wm=0 tw=0 %-----------------------------------------------------------------------------% -% Copyright (C) 1994-2006, 2010 The University of Melbourne. +% Copyright (C) 1994-2006, 2010-2011 The University of Melbourne. % This file may only be copied under the terms of the GNU Library General % Public License - see the file COPYING.LIB in the Mercury distribution. %-----------------------------------------------------------------------------% @@ -65,8 +65,11 @@ % :- pred fold_maybe(pred(T, U, U), maybe(T), U, U). :- mode fold_maybe(pred(in, in, out) is det, in, in, out) is det. -:- mode fold_maybe(pred(in, in, out) is semidet, in, in, out) is semidet. +:- mode fold_maybe(pred(in, mdi, muo) is det, in, mdi, muo) is det. :- mode fold_maybe(pred(in, di, uo) is det, in, di, uo) is det. +:- mode fold_maybe(pred(in, in, out) is semidet, in, in, out) is semidet. +:- mode fold_maybe(pred(in, mdi, muo) is semidet, in, mdi, muo) is semidet. +:- mode fold_maybe(pred(in, di, uo) is semidet, in, di, uo) is semidet. % fold_maybe(_, no, Acc) = Acc. % fold_maybe(F, yes(Value), Acc0) = F(Acc0). @@ -78,17 +81,52 @@ % P(Value, Value, !Acc). % :- pred map_fold_maybe(pred(T, U, Acc, Acc), maybe(T), maybe(U), Acc, Acc). -:- mode map_fold_maybe(pred(in, out, in, out) is det, in, out, in, out) is det. -:- mode map_fold_maybe(pred(in, out, di, uo) is det, in, out, di, uo) is det. +:- mode map_fold_maybe(pred(in, out, in, out) is det, in, out, + in, out) is det. +:- mode map_fold_maybe(pred(in, out, mdi, muo) is det, in, out, + mdi, muo) is det. +:- mode map_fold_maybe(pred(in, out, di, uo) is det, in, out, + di, uo) is det. +:- mode map_fold_maybe(pred(in, out, in, out) is semidet, in, out, + in, out) is semidet. +:- mode map_fold_maybe(pred(in, out, mdi, muo) is semidet, in, out, + mdi, muo) is semidet. +:- mode map_fold_maybe(pred(in, out, di, uo) is semidet, in, out, + di, uo) is semidet. % As above, but with two accumulators. % :- pred map_fold2_maybe(pred(T, U, Acc1, Acc1, Acc2, Acc2), maybe(T), maybe(U), Acc1, Acc1, Acc2, Acc2). -:- mode map_fold2_maybe(pred(in, out, in, out, in, out) is det, in, out, - in, out, in, out) is det. +:- mode map_fold2_maybe(pred(in, out, in, out, in, out) is det, + in, out, in, out, in, out) is det. +:- mode map_fold2_maybe(pred(in, out, in, out, mdi, muo) is det, + in, out, in, out, mdi, muo) is det. :- mode map_fold2_maybe(pred(in, out, in, out, di, uo) is det, in, out, in, out, di, uo) is det. +:- mode map_fold2_maybe(pred(in, out, in, out, in, out) is semidet, + in, out, in, out, in, out) is semidet. +:- mode map_fold2_maybe(pred(in, out, in, out, mdi, muo) is semidet, + in, out, in, out, mdi, muo) is semidet. +:- mode map_fold2_maybe(pred(in, out, in, out, di, uo) is semidet, + in, out, in, out, di, uo) is semidet. + + % As above, but with three accumulators. + % +:- pred map_fold3_maybe(pred(T, U, Acc1, Acc1, Acc2, Acc2, Acc3, Acc3), + maybe(T), maybe(U), Acc1, Acc1, Acc2, Acc2, Acc3, Acc3). +:- mode map_fold3_maybe(pred(in, out, in, out, in, out, in, out) is det, + in, out, in, out, in, out, in, out) is det. +:- mode map_fold3_maybe(pred(in, out, in, out, in, out, mdi, muo) is det, + in, out, in, out, in, out, mdi, muo) is det. +:- mode map_fold3_maybe(pred(in, out, in, out, in, out, di, uo) is det, + in, out, in, out, in, out, di, uo) is det. +:- mode map_fold3_maybe(pred(in, out, in, out, in, out, in, out) is semidet, + in, out, in, out, in, out, in, out) is semidet. +:- mode map_fold3_maybe(pred(in, out, in, out, in, out, mdi, muo) is semidet, + in, out, in, out, in, out, mdi, muo) is semidet. +:- mode map_fold3_maybe(pred(in, out, in, out, in, out, di, uo) is semidet, + in, out, in, out, in, out, di, uo) is semidet. % maybe_is_yes(yes(X), X). % @@ -121,6 +159,10 @@ map_fold2_maybe(_, no, no, !A, !B). map_fold2_maybe(P, yes(T0), yes(T), !A, !B) :- P(T0, T, !A, !B). +map_fold3_maybe(_, no, no, !A, !B, !C). +map_fold3_maybe(P, yes(T0), yes(T), !A, !B, !C) :- + P(T0, T, !A, !B, !C). + maybe_is_yes(yes(X), X). %-----------------------------------------------------------------------------%