
:- auto_table.

:- import ith/3, length/2 from basics.

t_list_contains(List, Item, 1) :- triple(List, '*daml:head', Item).
t_list_contains(List, Item, N) :- triple(List, '*daml:tail', Tail),
		                  t_list_contains(Tail, Item, M),
				  N is M+1.

t_list_length(List, 0) :- List = '*daml:nil'.
t_list_length(List, N) :- triple(List, '*daml:tail', Tail),
	                  t_list_length(Tail, M),
			  N is M+1.

t_list_length_le(List, N) :- t_list_length(List, Len), LP is Len+1, N < LP.

field(TableName, R, C, data, Text) :-
  triple(TableName, '#row_list', Rows),
  triple('#table', '#column_list', Columns),
  t_list_contains(Rows, Row, RM),
  R is RM+1,
  t_list_contains(Columns, Col, C),
  triple(Col, '#property', Property),
  triple(Row, Property, Text).

field(TableName, 1, C, heading, Text) :-
  triple(TableName, '#column_list', Columns),
  t_list_contains(Columns, Col, C),
  triple(Col, '#title', Text).

rows(TableName, N) :- 
   triple(TableName, '#row_list', L),
   t_list_length(L, N).

cols(TableName, N) :- 
   triple(TableName, '#column_list', L),
   t_list_length(L, N).

rows_includes(TableName, N) :- 
   triple(TableName, '#row_list', L),
   t_list_length_le(L, N).

cols_includes(TableName, N) :- 
   triple(TableName, '#column_list', L),
   t_list_length_le(L, N).

demo(TableName, Text) :-
   htable(TableName, Bytes, []),
   name(Text, Bytes).


htable(T) --> "<table>", [10], rows(T,1), "</table>".
row(T,N) --> "<tr>", [10], N, "</tr>", [10].
rows(T,N) --> [X], 
              (({rows_includes(T,N)}, {Next is N+1}, rows(T, Next))
              ; {true}).

cols([]) --> [].
cols([First|Rest]) --> field(First), cols(Rest).

% field(F) --> { header(F) }, "  <th>", F, "</th>", [10].
field(F) --> "  <td>", F, "</td>", [10].

% text(X,Y) :- =(X,Y).
% header("12").

%  htable([["11", "12", "13"],["21", "22", "23"],["31", "32", "33"]], X, []), name(Y,X).

