let rec guess_from_filename filename =
match Filename.split_extension filename with
| (f, Some "gz") ->
guess_from_filename f
>>= fun t ->
return (`gzip t)
| (_, Some term) ->
begin match term with
| "gff" -> return (`gff Gff.default_tags)
| "wig" -> return (`wig Wig.default_tags)
| "bam" -> return `bam
| "sam" -> return `sam
| "bed" -> return `bed
| "fastq" -> return `fastq
| "fasta" -> return (`fasta `unknown)
| "tsv" -> return (`table '\t')
| u -> fail (`extension_unknown u)
end
| (_, None) -> fail (`extension_absent)