:- module(dcgs,
[op(1105, xfy, '|'),
phrase/2,
- phrase/3]).
+ phrase/3,
+ seq//1,
+ seqq//1]).
:- use_module(library(error)).
:- use_module(library(lists), [append/3]).
nonvar(Term0),
dcg_rule(Term0, (Head :- Body)),
Term = (Head :- Body).
+
+% Describes a sequence
+seq([]) --> [].
+seq([E|Es]) --> [E], seq(Es).
+
+% Describes a sequence of sequences
+seqq([]) --> [].
+seqq([Es|Ess]) --> seq(Es), seqq(Ess).
:- module(pio, [phrase_from_file/2,
- phrase_from_file/3,
- raw_chars//1]).
+ phrase_from_file/3]).
:- 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([]) --> [].
test_json_minify :-
test_path("pass_everything.min.json", MinPath),
- once(phrase_from_file(raw_chars(RefChars), MinPath)),
+ once(phrase_from_file(seq(RefChars), MinPath)),
name_parse("pass_everything.json", Json),
time(once(phrase(json_chars(Json), MinChars))),
RefChars = MinChars.