29
30:- module(streams, [ open_null_stream/1, 31 open_input/2, 32 close_input/1, 33 open_output/2, 34 close_output/1 35 ], [assertions]). 36
37:- use_module(engine(internals)). 39stream(_).
40
41:- doc(title,"Structured stream handling"). 42
43:- pred open_input(FileName,InputStreams)
44 : sourcename(FileName)
45 => input_handler(InputStreams).
46
47open_input(FileName, i(OldInput, NewInput)) :-
48 current_input(OldInput),
49 open(FileName, read, NewInput),
50 set_input(NewInput).
51
52:- pred close_input(InputStreams)
53 : input_handler(InputStreams)
54 => input_handler(InputStreams).
55
56close_input(i(OldInput, NewInput)) :- !,
57 set_input(OldInput),
58 close(NewInput).
59close_input(X) :-
60 throw(error(domain_error(open_input_handler, X), close_input/1-1)).
61
62:- pred open_output(FileName,OutputStreams)
63 : sourcename(FileName)
64 => output_handler(OutputStreams).
65
66open_output(FileName, o(OldOutput, NewOutput)) :-
67 current_output(OldOutput),
68 open(FileName, write, NewOutput),
69 set_output(NewOutput).
70
71:- pred close_output(OutputStreams)
72 : output_handler(OutputStreams)
73 => output_handler(OutputStreams).
74
75close_output(o(OldOutput, NewOutput)) :- !,
76 set_output(OldOutput),
77 close(NewOutput).
78close_output(X) :-
79 throw(error(domain_error(open_output_handler, X), close_output/1-1)).
80
81:- prop input_handler/1 + regtype.
82
83input_handler(i(Old,New)):-
84 stream(Old),
85 stream(New).
86
87:- prop output_handler/1 + regtype.
88
89output_handler(o(Old,New)):-
90 stream(Old),
91 stream(New)