From e0e812f95cb632429311919badc6d70e330191fa Mon Sep 17 00:00:00 2001 From: panasenco Date: Sat, 24 Apr 2021 21:29:50 -0700 Subject: [PATCH] Added aw_chars//1 to library(pio). Began using setup_call_cleanup/3 as suggested by @triska. --- src/lib/pio.pl | 15 ++++++++++++++- src/tests/json/test_json.pl | 13 +++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/lib/pio.pl b/src/lib/pio.pl index 1df9a796..9e57dabe 100644 --- a/src/lib/pio.pl +++ b/src/lib/pio.pl @@ -1,5 +1,6 @@ :- 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)). @@ -43,3 +44,15 @@ reader_step(Stream, Pos, Xs0) :- 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([]) --> []. diff --git a/src/tests/json/test_json.pl b/src/tests/json/test_json.pl index 1c234758..e03a3cfd 100644 --- a/src/tests/json/test_json.pl +++ b/src/tests/json/test_json.pl @@ -7,6 +7,7 @@ :- 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) :- @@ -33,15 +34,15 @@ minify_sample_json :- 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. -- 2.54.0