:- module(pio, [phrase_from_file/2,
- phrase_from_file/3]).
+ phrase_from_file/3,
+ raw_chars//1]).
:- use_module(library(dcgs)).
:- use_module(library(error)).
partial_string(Cs, Xs0, Xs),
stream_to_lazy_list(Stream, Xs)
).
+
+/* Relate a character list to itself greedily - for reading raw file contents using `phrase_from_file/2`
+ A quick benchmark:
+ Greedy (recurse first):
+ ?- time(phrase_from_file(raw_chars(_), '/mnt/544KB.json')).
+ % CPU time: 22.471 seconds
+ Generous (empty list first):
+ ?- time(phrase_from_file(raw_chars(_), '/mnt/544KB.json')).
+ % CPU time: 44.119 seconds
+*/
+raw_chars([C|Cs]) --> [C], raw_chars(Cs).
+raw_chars([]) --> [].
:- use_module(library(lists)).
:- use_module(library(os)).
:- use_module(library(pio)).
+:- use_module(library(iso_ext)).
:- use_module(library(time)).
test_path(TestName, TestPath) :-
name_parse("pass_everything.json", Json),
time(once(phrase(json_chars(Json), MinChars))),
test_path("pass_everything.min.json", MinPath),
- open(MinPath, write, Stream),
- format(Stream, "~s", [MinChars]),
- close(Stream).
+ setup_call_cleanup(
+ open(MinPath, write, Stream),
+ format(Stream, "~s", [MinChars]),
+ close(Stream)
+ ).
test_json_minify :-
test_path("pass_everything.min.json", MinPath),
- open(MinPath, read, Stream),
- read_line_to_chars(Stream, RefChars, []),
- close(Stream),
+ once(phrase_from_file(raw_chars(RefChars), MinPath)),
name_parse("pass_everything.json", Json),
time(once(phrase(json_chars(Json), MinChars))),
RefChars = MinChars.