##' parsing phylip tree format
##'
##' 
##' @title read.phylip
##' @param file phylip file
##' @return an instance of 'phylip'
##' @export
## @importFrom Biostrings BStringSet
##' @author Guangchuang Yu
read.phylip <- function(file) {
    phylip <- readLines(file)
    i <- grep("^\\d+$", phylip)
    if (length(i) != 1) {
        stop("input file is not phylip tree format...")
    }
    n <- length(phylip)
    ntree <- as.numeric(phylip[i])
    trees <- read.tree(text=phylip[(i+1):n])

    phylipInfo <- strsplit(phylip[1], split="\\s") %>% unlist
    nseq <- phylipInfo[1]
    seqLen <- phylipInfo[2]
    if (nseq != i-2) {
        stop("only sequential format is supported...\n-> see http://evolution.genetics.washington.edu/phylip/doc/sequence.html")
    }
    seqlines <- phylip[2:(i-1)]
    seq_with_name <- lapply(seqlines, function(x) unlist(strsplit(x, "\\s+")))
    seqs <- sapply(seq_with_name, function(x) x[2])
    names(seqs) <- sapply(seq_with_name, function(x) x[1])

    if (any(nchar(seqs) != seqLen)) {
        stop(paste("sequence length not consistent...\n->", paste0(nchar(seqs), collapse=" ")))
    }
    
    new("phylip",
        file = filename(file),
        phylo = trees,
        ntree = ntree,
        sequence = seqs
        )
}