:- lib( mtx_call_user_mod/3 ).

%% mtx_header_column_multi_pos( +Hdr, +Cid, -Cnms, -Poss ).
%
% Findall Cnms and Poss corresponding to Cid. Cid could be a number (Cnms and Poss are then 
% singletons), a list of Cids (numbers or column names) or predicate that can be called 
% on all Hdr args (then Cnms and Poss correspond to the column names that were true).
%
%==
% ?- mtx_header_column_multi_pos( hdr(a,b,a,c), =(a), Cnms, Poss ).
%  Cnms = [a, a],
%  Poss = [1, 3].
%
% ?- mtx_header_column_multi_pos( hdr(a,b,a,c), [b,c], Cnms, Pos ).
% Cnms = [b, c],
% Pos = [2, 4].
%==
%
% @author nicos angelopoulos
% @version  0.1 2014/9/22
%
mtx_header_column_multi_pos( Hdr, Cid, Cnms, Poss ) :-
	is_list( Cid ),
	!,
	maplist( mtx_header_column_name_pos(Hdr), Cid, Cnms, Poss ).
mtx_header_column_multi_pos( Hdr, Cid, Cnms, Poss ) :-
	atomic( Cid ),
	( number(Cid); \+ (current_predicate(Cid/1); current_predicate(user:Cid/1)) ),
	!,
	maplist( mtx_header_column_name_pos(Hdr), [Cid], Cnms, Poss ).
mtx_header_column_multi_pos( Hdr, Cid, Cnms, Poss ) :-
	functor( Hdr, _, Arity ),
	mtx_call_user_mod( Cid, 1, Call ),
	findall( Pos, (between(1,Arity,Pos),arg(Pos,Hdr,Cnm),call(Call,Cnm)), Poss ),
	findall( Cnm, (member(Pos,Poss),arg(Pos,Hdr,Cnm)), Cnms ),
	!.
mtx_header_column_multi_pos( Hdr, Cid, _Cnms, _Poss ) :-
	% fixme
	throw( could_not_locate_multi_column_in_header_row(Cid,Hdr) ).