func initBufferedReader(file string, bufferSize int, chunkSize int, fn func(line string) (interface{}, bool, error)) (*BufferedReader, error) { if bufferSize < 1 { bufferSize = 1 } if chunkSize < 1 { chunkSize = 1 } reader := new(BufferedReader) fh, err := xopen.Ropen(file) if err != nil { return nil, err } reader.reader = fh reader.BufferSize = bufferSize reader.ChunkSize = chunkSize reader.ProcessFunc = fn reader.Ch = make(chan Chunk, bufferSize) reader.done = make(chan struct{}) reader.finished = false reader.cancelled = false return reader, nil }
// NewReader is constructor of FASTX Reader. // // Parameters: // // t sequence alphabet // if nil is given, it will guess alphabet by the first record // file file name, "-" for stdin // idRegexp id parsing regular expression string, must contains "(" and ")" to capture matched ID // "" for default value: `^([^\s]+)\s?` // if record head does not match the idRegxp, whole name will be the id // func NewReader(t *seq.Alphabet, file string, idRegexp string) (*Reader, error) { var r *regexp.Regexp if idRegexp == "" { r = regexp.MustCompile(DefaultIDRegexp) isUsingDefaultIDRegexp = true } else { if !reCheckIDregexpStr.MatchString(idRegexp) { return nil, fmt.Errorf(`fastx: regular expression must contain "(" and ")" to capture matched ID. default: %s`, DefaultIDRegexp) } var err error r, err = regexp.Compile(idRegexp) if err != nil { return nil, fmt.Errorf("fastx: fail to compile regexp: %s", idRegexp) } if idRegexp == DefaultIDRegexp { isUsingDefaultIDRegexp = true } } fh, err := xopen.Ropen(file) if err != nil { return nil, fmt.Errorf("fastx: %s", err) } fastxReader := &Reader{ fh: fh, buf: make([]byte, pageSize), t: t, IDRegexp: r, firstseq: true, checkSeqType: true, } fastxReader.buffer = bytes.NewBuffer(make([]byte, 0, defaultBytesBufferSize)) fastxReader.seqBuffer = bytes.NewBuffer(make([]byte, 0, defaultBytesBufferSize)) fastxReader.qualBuffer = bytes.NewBuffer(make([]byte, 0, defaultBytesBufferSize)) return fastxReader, nil }