You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wc-go/pkg/wc/complex-counter.go

59 lines
1.1 KiB

package wc
import (
"bytes"
"unicode"
)
type ComplexCount struct {
CharCount int64
WordCount int64
LineCount int64
MaxLineLength int64
}
func GetComplexCount(chunk []byte) ComplexCount {
var count = ComplexCount{}
word := false
var lineLength int64
runes := bytes.Runes(chunk)
for _, b := range runes {
count.CharCount++
if b == '\n' {
if lineLength > count.MaxLineLength {
count.MaxLineLength = lineLength
}
lineLength = 0
count.LineCount++
if word {
word = false
count.WordCount++
}
} else if unicode.IsSpace(b) {
lineLength++
if word {
word = false
count.WordCount++
}
} else {
lineLength++
word = true
}
}
return count
}
func ConcurrentComplexChunkCounter(chunks <-chan []byte, counts chan<- ComplexCount) {
var totalCount ComplexCount
for chunk := range chunks {
count := GetComplexCount(chunk)
totalCount.CharCount += count.CharCount
totalCount.WordCount += count.WordCount
totalCount.LineCount += count.LineCount
if count.MaxLineLength > totalCount.MaxLineLength {
totalCount.MaxLineLength = count.MaxLineLength
}
}
counts <- totalCount
}