%
% Preliminary support for FASTA format.
% Just convert sequence into string of atoms.
%
% support for a single sequence.
%

:- module(fasta,
		[fa2atoms/2,
		 fa2atoms/3
		]).

fa2atoms(F, L) :-
	fa2atoms(F, L, []).

fa2atoms(F,L,L0) :-
	open(F,read,S),
	get0(S,C0),
	skip_header(C0,S),
	get0(S,C),
	read_chars(C, S, L, L0),
	close(S).

read_chars(-1,_) --> [].
read_chars(10,S) --> !,
	{ get0(S,MC) },
	read_chars(MC,S).
read_chars(C,S) -->
	[AC],
	{
	  cvt_c(C,AC),
	  get0(S,MC)
	},
	read_chars(MC, S).

cvt_c(C,A) :-
	C >= 0'A, C =< 0'Z, !,
	AC is C-(0'A-0'a),
	atom_codes(A,[AC]).
cvt_c(C,A) :-
	C >= 0'a, C =< 0'z,
	atom_codes(A,[C]).

skip_header(10,_) :- !.
skip_header(_,S) :-
	get0(S,C),
	skip_header(C,S).