Next: mercury_term_lexer, Previous: math, Up: Top [Contents]
%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 1994-2006, 2010-2011 The University of Melbourne. % Copyright (C) 2016-2018 The Mercury Team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: maybe.m. % Main author: fjh. % Stability: high. % % This module defines the "maybe" type. % %--------------------------------------------------% %--------------------------------------------------% :- module maybe. :- interface. :- import_module list. %--------------------------------------------------% :- type maybe(T) ---> no ; yes(T). :- inst maybe(I) for maybe/1 ---> no ; yes(I). :- inst maybe_yes(I) for maybe/1 ---> yes(I). :- type maybe_error ---> ok ; error(string). :- type maybe_error(T) == maybe_error(T, string). % Either a T, or an error E. :- type maybe_error(T, E) ---> ok(T) ; error(E). :- inst maybe_error(I) for maybe_error/2 ---> ok(I) ; error(ground). :- inst maybe_error_ok(I) for maybe_error/2 ---> ok(I). :- type maybe_errors(T) == maybe_errors(T, string). % Either a T, or one or more errors E. :- type maybe_errors(T, E) ---> ok(T) ; error(E, list(E)). :- inst maybe_errors_ok(I) for maybe_errors/2 ---> ok(I). % map_maybe(_, no) = no. % map_maybe(F, yes(Value)) = yes(F(Value)). % :- func map_maybe(func(T) = U, maybe(T)) = maybe(U). % map_maybe(_, no, no). % map_maybe(P, yes(Value0), yes(Value)) :- P(Value, Value). % :- pred map_maybe(pred(T, U), maybe(T), maybe(U)). :- mode map_maybe(pred(in, out) is det, in, out) is det. :- mode map_maybe(pred(in, out) is semidet, in, out) is semidet. :- mode map_maybe(pred(in, out) is multi, in, out) is multi. :- mode map_maybe(pred(in, out) is nondet, in, out) is nondet. % fold_maybe(_, no, Acc) = Acc. % fold_maybe(F, yes(Value), Acc0) = F(Value, Acc0). % :- func fold_maybe(func(T, U) = U, maybe(T), U) = U. % fold_maybe(_, no, !Acc). % fold_maybe(P, yes(Value), !Acc) :- P(Value, !Acc). % :- pred fold_maybe(pred(T, A, A), maybe(T), A, A). :- mode fold_maybe(pred(in, in, out) is det, in, in, out) is det. :- 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. % As above, but with two accumulators. % :- pred fold2_maybe(pred(T, A, A, B, B), maybe(T), A, A, B, B). :- mode fold2_maybe(pred(in, in, out, in, out) is det, in, in, out, in, out) is det. :- mode fold2_maybe(pred(in, in, out, mdi, muo) is det, in, in, out, mdi, muo) is det. :- mode fold2_maybe(pred(in, in, out, di, uo) is det, in, in, out, di, uo) is det. :- mode fold2_maybe(pred(in, in, out, in, out) is semidet, in, in, out, in, out) is semidet. :- mode fold2_maybe(pred(in, in, out, mdi, muo) is semidet, in, in, out, mdi, muo) is semidet. :- mode fold2_maybe(pred(in, in, out, di, uo) is semidet, in, in, out, di, uo) is semidet. % As above, but with three accumulators. % :- pred fold3_maybe(pred(T, A, A, B, B, C, C), maybe(T), A, A, B, B, C, C). :- mode fold3_maybe(pred(in, in, out, in, out, in, out) is det, in, in, out, in, out, in, out) is det. :- mode fold3_maybe(pred(in, in, out, in, out, mdi, muo) is det, in, in, out, in, out, mdi, muo) is det. :- mode fold3_maybe(pred(in, in, out, in, out, di, uo) is det, in, in, out, in, out, di, uo) is det. :- mode fold3_maybe(pred(in, in, out, in, out, in, out) is semidet, in, in, out, in, out, in, out) is semidet. :- mode fold3_maybe(pred(in, in, out, in, out, mdi, muo) is semidet, in, in, out, in, out, mdi, muo) is semidet. :- mode fold3_maybe(pred(in, in, out, in, out, di, uo) is semidet, in, in, out, in, out, di, uo) is semidet. % As above, but with four accumulators. % :- pred fold4_maybe(pred(T, A, A, B, B, C, C, D, D), maybe(T), A, A, B, B, C, C, D, D). :- mode fold4_maybe(pred(in, in, out, in, out, in, out, in, out) is det, in, in, out, in, out, in, out, in, out) is det. :- mode fold4_maybe(pred(in, in, out, in, out, in, out, mdi, muo) is det, in, in, out, in, out, in, out, mdi, muo) is det. :- mode fold4_maybe(pred(in, in, out, in, out, in, out, di, uo) is det, in, in, out, in, out, in, out, di, uo) is det. :- mode fold4_maybe(pred(in, in, out, in, out, in, out, in, out) is semidet, in, in, out, in, out, in, out, in, out) is semidet. :- mode fold4_maybe(pred(in, in, out, in, out, in, out, mdi, muo) is semidet, in, in, out, in, out, in, out, mdi, muo) is semidet. :- mode fold4_maybe(pred(in, in, out, in, out, in, out, di, uo) is semidet, in, in, out, in, out, in, out, di, uo) is semidet. % As above, but with five accumulators. % :- pred fold5_maybe(pred(T, A, A, B, B, C, C, D, D, E, E), maybe(T), A, A, B, B, C, C, D, D, E, E). :- mode fold5_maybe( pred(in, in, out, in, out, in, out, in, out, in, out) is det, in, in, out, in, out, in, out, in, out, in, out) is det. :- mode fold5_maybe( pred(in, in, out, in, out, in, out, in, out, mdi, muo) is det, in, in, out, in, out, in, out, in, out, mdi, muo) is det. :- mode fold5_maybe( pred(in, in, out, in, out, in, out, in, out, di, uo) is det, in, in, out, in, out, in, out, in, out, di, uo) is det. :- mode fold5_maybe( pred(in, in, out, in, out, in, out, in, out, in, out) is semidet, in, in, out, in, out, in, out, in, out, in, out) is semidet. :- mode fold5_maybe( pred(in, in, out, in, out, in, out, in, out, mdi, muo) is semidet, in, in, out, in, out, in, out, in, out, mdi, muo) is semidet. :- mode fold5_maybe( pred(in, in, out, in, out, in, out, in, out, di, uo) is semidet, in, in, out, in, out, in, out, in, out, di, uo) is semidet. % map_fold_maybe(_, no, no, !Acc). % map_fold_maybe(P, yes(Value0), yes(Value), !Acc) :- % P(Value, Value, !Acc). % :- pred map_fold_maybe(pred(T, U, A, A), maybe(T), maybe(U), A, A). :- 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, A, A, B, B), maybe(T), maybe(U), A, A, B, B). :- 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, A, A, B, B, C, C), maybe(T), maybe(U), A, A, B, B, C, C). :- 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. % As above, but with four accumulators. % :- pred map_fold4_maybe(pred(T, U, A, A, B, B, C, C, D, D), maybe(T), maybe(U), A, A, B, B, C, C, D, D). :- mode map_fold4_maybe( pred(in, out, in, out, in, out, in, out, in, out) is det, in, out, in, out, in, out, in, out, in, out) is det. :- mode map_fold4_maybe( pred(in, out, in, out, in, out, in, out, mdi, muo) is det, in, out, in, out, in, out, in, out, mdi, muo) is det. :- mode map_fold4_maybe( pred(in, out, in, out, in, out, in, out, di, uo) is det, in, out, in, out, in, out, in, out, di, uo) is det. :- mode map_fold4_maybe( pred(in, out, in, out, in, out, in, out, in, out) is semidet, in, out, in, out, in, out, in, out, in, out) is semidet. :- mode map_fold4_maybe( pred(in, out, in, out, in, out, in, out, mdi, muo) is semidet, in, out, in, out, in, out, in, out, mdi, muo) is semidet. :- mode map_fold4_maybe( pred(in, out, in, out, in, out, in, out, di, uo) is semidet, in, out, in, out, in, out, in, out, di, uo) is semidet. % As above, but with five accumulators. % :- pred map_fold5_maybe(pred(T, U, A, A, B, B, C, C, D, D, E, E), maybe(T), maybe(U), A, A, B, B, C, C, D, D, E, E). :- mode map_fold5_maybe( pred(in, out, in, out, in, out, in, out, in, out, in, out) is det, in, out, in, out, in, out, in, out, in, out, in, out) is det. :- mode map_fold5_maybe( pred(in, out, in, out, in, out, in, out, in, out, mdi, muo) is det, in, out, in, out, in, out, in, out, in, out, mdi, muo) is det. :- mode map_fold5_maybe( pred(in, out, in, out, in, out, in, out, in, out, di, uo) is det, in, out, in, out, in, out, in, out, in, out, di, uo) is det. :- mode map_fold5_maybe( pred(in, out, in, out, in, out, in, out, in, out, in, out) is semidet, in, out, in, out, in, out, in, out, in, out, in, out) is semidet. :- mode map_fold5_maybe( pred(in, out, in, out, in, out, in, out, in, out, mdi, muo) is semidet, in, out, in, out, in, out, in, out, in, out, mdi, muo) is semidet. :- mode map_fold5_maybe( pred(in, out, in, out, in, out, in, out, in, out, di, uo) is semidet, in, out, in, out, in, out, in, out, in, out, di, uo) is semidet. % maybe_is_yes(yes(X), X). % % This is useful as an argument to list.filter_map. % :- pred maybe_is_yes(maybe(T)::in, T::out) is semidet. % pred_to_maybe(Pred) = MaybeResult. % % Make a maybe value from a semidet predicate. % :- func pred_to_maybe(pred(T)) = maybe(T). :- mode pred_to_maybe(pred(out) is semidet) = out is det. :- func func_to_maybe((func) = T) = maybe(T). :- mode func_to_maybe((func) = out is semidet) = out is det. % Return the value from within the maybe or a default value if there is % none. % :- func maybe_default(T, maybe(T)) = T. %--------------------------------------------------% %--------------------------------------------------%
Next: mercury_term_lexer, Previous: math, Up: Top [Contents]