github.com/biogo/biogo@v1.0.4/io/seqio/alignio/alignio.go (about)

     1  // Copyright ©2011-2013 The bíogo Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package alignio for reading and writing multiple sequence alignment files
     6  package alignio
     7  
     8  import (
     9  	"github.com/biogo/biogo/io/seqio"
    10  	"github.com/biogo/biogo/seq/multi"
    11  
    12  	"io"
    13  )
    14  
    15  // Reader implements multiple sequence reading from a seqio.Reader.
    16  type Reader struct {
    17  	r seqio.Reader
    18  	m *multi.Multi
    19  }
    20  
    21  // NewReader return a new Reader that will read sequences from r into m.
    22  func NewReader(r seqio.Reader, m *multi.Multi) *Reader {
    23  	return &Reader{r, m}
    24  }
    25  
    26  // Read the contents of the embedded seqio.Reader into a seq.Sequence.
    27  // Returns the Alignment, or nil and an error if an error occurs.
    28  func (r *Reader) Read() (*multi.Multi, error) {
    29  	for {
    30  		s, err := r.r.Read()
    31  		if err != nil {
    32  			if err == io.EOF {
    33  				break
    34  			} else {
    35  				return nil, err
    36  			}
    37  		}
    38  		r.m.Add(s)
    39  	}
    40  
    41  	m, t := r.m, *r.m
    42  	t.Seq = nil
    43  	r.m = &t
    44  
    45  	return m, nil
    46  }
    47  
    48  // Writer implements multiple sequence writing to a seqio.Writer.
    49  type Writer struct {
    50  	w seqio.Writer
    51  }
    52  
    53  // Return a new Writer.
    54  func NewWriter(w seqio.Writer) *Writer {
    55  	return &Writer{w}
    56  }
    57  
    58  // Write a multi.Multi to the embedded seqio.Writer.
    59  // Returns the number of bytes written and any error.
    60  func (w *Writer) Write(m *multi.Multi) (n int, err error) {
    61  	var _n int
    62  	for _, s := range m.Seq {
    63  		_n, err = w.w.Write(s)
    64  		n += _n
    65  		if err != nil {
    66  			break
    67  		}
    68  	}
    69  
    70  	return
    71  }