Files
obitools4/pkg/obiformats/batch_of_files_reader.go
Eric Coissac a33e471b39 First attempt for obiconsensus... The graph traversing algorithm is too simple
Former-commit-id: 0456e6c7fd55d6d0fcf9856c40386b976b912cba
2023-03-27 19:51:10 +07:00

67 lines
1.2 KiB
Go

package obiformats
import (
"log"
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obiiter"
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obiutils"
)
func ReadSequencesBatchFromFiles(filenames []string,
reader IBatchReader,
concurrent_readers int,
options ...WithOption) obiiter.IBioSequence {
if reader == nil {
reader = ReadSequencesFromFile
}
batchiter := obiiter.MakeIBioSequence()
nextCounter := obiutils.AtomicCounter()
batchiter.Add(concurrent_readers)
go func() {
batchiter.WaitAndClose()
log.Println("Finnished to read every files")
}()
filenameChan := make(chan string)
go func() {
for _, filename := range filenames {
filenameChan <- filename
}
close(filenameChan)
}()
for i := 0; i < concurrent_readers; i++ {
go func() {
for filename := range filenameChan {
iter, err := reader(filename, options...)
if err != nil {
log.Panicf("Cannot open file %s : %v", filename, err)
}
log.Printf("Start reading of file : %s", filename)
for iter.Next() {
batch := iter.Get()
batchiter.Push(batch.Reorder(nextCounter()))
}
log.Printf("End of reading of file : %s", filename)
}
batchiter.Done()
}()
}
return batchiter
}