mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-06-29 16:20:46 +00:00
46 lines
599 B
Go
46 lines
599 B
Go
package obikmer
|
|
|
|
import (
|
|
"iter"
|
|
"slices"
|
|
)
|
|
|
|
var baseError = map[byte]byte{
|
|
'a': 'b',
|
|
'c': 'd',
|
|
'g': 'h',
|
|
't': 'v',
|
|
'r': 'y',
|
|
'y': 'r',
|
|
's': 'w',
|
|
'w': 's',
|
|
'k': 'm',
|
|
'm': 'k',
|
|
'd': 'c',
|
|
'v': 't',
|
|
'h': 'g',
|
|
'b': 'a',
|
|
}
|
|
|
|
type BytesItem []byte
|
|
|
|
func IterateOneError(kmer []byte) iter.Seq[BytesItem] {
|
|
lkmer := len(kmer)
|
|
return func(yield func(BytesItem) bool) {
|
|
for p := 0; p < lkmer; p++ {
|
|
for p < lkmer && kmer[p] == 'n' {
|
|
p++
|
|
}
|
|
|
|
if p < lkmer {
|
|
nkmer := slices.Clone(kmer)
|
|
nkmer[p] = baseError[kmer[p]]
|
|
if !yield(nkmer) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|