:- set_prolog_flag(double_quotes, chars).

:- use_module(library(lambda)).
:- use_module(library(dif)).
:- use_module(library(pio)).
:- use_module(library(dcgs)).
:- use_module(library(clpz)).
:- use_module(library(reif)).
:- use_module(library(time)).
:- use_module(library(lists)).
:- use_module(library(charsio)).
:- use_module(library(iso_ext)).


% DCG number parsing (from @bakaq on GitHub)
number_canonchars(N, Cs) :-
    number_chars(N, Cs),
    number_chars(N, Cs0),
    Cs = Cs0.

digits([D|Ds]) --> [D], { char_type(D, decimal_digit) }, digits_(Ds).

digits_([]) --> [].
digits_([D|Ds]) --> digits([D|Ds]).

number(N) --> digits(Chars), { number_canonchars(N, Chars) }.


% parse a sequence of Elts separated by Sep
sequence(_,   _,   [])     --> [].
sequence(Elt, Sep, [L|Ls]) --> call(Elt, L), sequence_(Elt, Sep, Ls).
sequence_(_,   _,   [])     --> [].
sequence_(Elt, Sep, [L|Ls]) --> Sep, call(Elt, L), sequence_(Elt, Sep, Ls).


% can be used tacit
sum(Ls,S) :- sum(Ls,#=,#S).

make_test(day(Day),Solver,P1,P2) :-
	call(Solver,P1_,P2_), if_(P1-P2 = P1_-P2_, Msg = "ok!", Msg = "failed :("), format("% Day ~d ~s~n",[Day,Msg]).


~/aoc25pl/dotscryerrc