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 }