:- module aoc. :- interface. :- import_module io. :- pred main(io::di, io::uo) is cc_multi. :- implementation. :- import_module basics. :- import_module string. :- import_module list. :- import_module exception. :- import_module univ. main(!IO) :- wrap_main(main2, !IO). :- pred main2(io::di, io::uo) is cc_multi. main2(!IO) :- command_line_arguments(Args, !IO), (if Args = [DayS, PartS, File], to_int(DayS, Day), part(PartS, Part) then ( read_lines_need(File, Lines, !IO), run_day(Day, Part, Lines, Out), write_line(univ_value(Out), !IO) ) else die("expected day, part, filename")). :- type sol == (pred(part, list(string), univ)). :- inst sol == (pred(in, in, out) is cc_multi). :- pred solution(int::in, sol::out(sol)) is semidet. :- import_module day1. solution(1, day1.run). :- import_module day2. solution(2, day2.run). :- import_module day3. solution(3, day3.run). :- import_module day4. solution(4, day4.run). :- pred run_day(int, part, list(string), univ). :- mode run_day(in, in, in, out) is cc_multi. run_day(Day, Part, Lines, Out) :- if solution(Day, P) then P(Part, Lines, Out) else die("no solution for day %d", [i(Day)]).