40 lines
1,002 B
Text
40 lines
1,002 B
Text
:- module range_extraction.
|
|
:- interface.
|
|
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module int, list, ranges, string.
|
|
|
|
main(!IO) :-
|
|
print_ranges(numbers, !IO).
|
|
|
|
:- pred print_ranges(list(int)::in, io::di, io::uo) is det.
|
|
|
|
print_ranges(Nums, !IO) :-
|
|
Ranges = ranges.from_list(Nums),
|
|
ranges.range_foldr(add_range_string, Ranges, [], RangeStrs),
|
|
io.write_list(RangeStrs, ",", io.write_string, !IO).
|
|
|
|
:- pred add_range_string(int::in, int::in,
|
|
list(string)::in, list(string)::out) is det.
|
|
|
|
add_range_string(L, H, !Strs) :-
|
|
( if L = H then
|
|
!:Strs = [int_to_string(L) | !.Strs]
|
|
else if L + 1 = H then
|
|
!:Strs = [int_to_string(L), int_to_string(H) | !.Strs]
|
|
else
|
|
!:Strs = [string.format("%d-%d", [i(L), i(H)]) | !.Strs]
|
|
).
|
|
|
|
:- func numbers = list(int).
|
|
|
|
numbers = [
|
|
0, 1, 2, 4, 6, 7, 8, 11, 12, 14,
|
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
|
25, 27, 28, 29, 30, 31, 32, 33, 35, 36,
|
|
37, 38, 39].
|