Files
mercury/tests/hard_coded/bidirectional.m
2020-09-29 09:09:47 +10:00

97 lines
2.2 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% Regression test.
% Tests predicates with multiple modes,
% reordering, and partially instantiated data structures.
%
:- module bidirectional.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module char.
:- import_module list.
:- import_module maybe.
:- import_module string.
main(!IO) :-
format_list_of_int(read, List, !IO),
format_list_of_int(write, List, !IO).
:- type rw
---> read
; write.
:- mode read == in(bound(read)).
:- mode write == in(bound(write)).
:- pred format_list_of_int(rw, list(int), io, io).
:- mode format_list_of_int(write, in, di, uo) is det.
:- mode format_list_of_int(read, out, di, uo) is det.
format_list_of_int(RW, List, !IO) :-
format_int(RW, Val, !IO),
(
Val = no,
List = []
;
Val = yes(X),
List = [X | _]
),
(
List = []
;
List = [_ | _],
format_list_of_int(RW, Xs, !IO),
List = [_ | Xs]
).
:- pred format_int(rw, maybe(int), io, io).
:- mode format_int(write, in, di, uo) is det.
:- mode format_int(read, out, di, uo) is det.
format_int(RW, MaybeVal, !IO) :-
(
RW = read,
my_read_line(MaybeLine, !IO),
( if
MaybeLine = ok(Chars),
string.from_char_list(Chars, Line),
string.to_int(Line, X)
then
MaybeVal = yes(X)
else
MaybeVal = no
)
;
RW = write,
(
MaybeVal = yes(X),
io.write_int(X, !IO),
io.write_string("\n", !IO)
;
MaybeVal = no,
io.write_string("\n", !IO)
)
).
:- pred my_read_line(io.result(list(char))::out, io::di, io::uo) is det.
my_read_line(Result, !IO) :-
io.read_line(Result0, !IO),
( if
Result0 = ok(Line0),
list.reverse(Line0, ['\n' | LineRev])
then
list.reverse(LineRev, Line),
Result = ok(Line)
else
Result = Result0
).