Patch an aligment bug on obipairing

This commit is contained in:
2023-01-25 13:22:56 +01:00
parent 9b7edf0908
commit cfddc78161
4 changed files with 112 additions and 27 deletions

View File

@@ -19,13 +19,19 @@ var _BioSequenceSlicePool = sync.Pool{
}
// > This function returns a pointer to a new `BioSequenceSlice` object
func NewBioSequenceSlice() *BioSequenceSlice {
return _BioSequenceSlicePool.Get().(*BioSequenceSlice)
func NewBioSequenceSlice(size ...int) *BioSequenceSlice {
slice := _BioSequenceSlicePool.Get().(*BioSequenceSlice)
if len(size) > 0 {
s := size[0]
slice.InsureCapacity(s)
(*slice)=(*slice)[0:s]
}
return slice
}
// `MakeBioSequenceSlice()` returns a pointer to a new `BioSequenceSlice` struct
func MakeBioSequenceSlice() BioSequenceSlice {
return *NewBioSequenceSlice()
func MakeBioSequenceSlice(size ...int) BioSequenceSlice {
return *NewBioSequenceSlice(size...)
}
func (s *BioSequenceSlice) Recycle() {

View File

@@ -5,6 +5,10 @@ type SeqAnnotator func(*BioSequence)
type SeqWorker func(*BioSequence) *BioSequence
type SeqSliceWorker func(BioSequenceSlice) BioSequenceSlice
func NilSeqWorker(seq *BioSequence) *BioSequence {
return seq
}
func AnnotatorToSeqWorker(function SeqAnnotator) SeqWorker {
f := func(seq *BioSequence) *BioSequence {
function(seq)
@@ -14,14 +18,57 @@ func AnnotatorToSeqWorker(function SeqAnnotator) SeqWorker {
}
func SeqToSliceWorker(worker SeqWorker, inplace bool) SeqSliceWorker {
f := func(input BioSequenceSlice) BioSequenceSlice {
output := input
if (! inplace) {
output = MakeBioSequenceSlice()
var f SeqSliceWorker
if worker == nil {
if inplace {
f = func(input BioSequenceSlice) BioSequenceSlice {
return input
}
} else {
f = func(input BioSequenceSlice) BioSequenceSlice {
output := MakeBioSequenceSlice(len(input))
copy(output,input)
return output
}
}
for i,s := range(input) {
} else {
f = func(input BioSequenceSlice) BioSequenceSlice {
output := input
if !inplace {
output = MakeBioSequenceSlice(len(input))
}
for i, s := range input {
output[i] = worker(s)
}
return output
}
}
return f
}
func SeqToSliceConditionalWorker(worker SeqWorker,
condition SequencePredicate,
inplace bool) SeqSliceWorker {
if condition == nil {
return SeqToSliceWorker(worker,inplace)
}
f := func(input BioSequenceSlice) BioSequenceSlice {
output := input
if !inplace {
output = MakeBioSequenceSlice(len(input))
}
for i, s := range input {
if condition(s) {
output[i] = worker(s)
} else {
output[i] = s
}
}
return output
}
@@ -29,3 +76,18 @@ func SeqToSliceWorker(worker SeqWorker, inplace bool) SeqSliceWorker {
return f
}
func (worker SeqWorker) ChainWorkers(next SeqWorker) SeqWorker {
if worker == nil {
return next
} else {
if next == nil {
return worker
}
}
f := func(seq *BioSequence) *BioSequence {
return next(worker(seq))
}
return f
}