68 lines
1.1 KiB
Go
68 lines
1.1 KiB
Go
// Package rnge provides a simple structure to represent a range with a start and end value.
|
|
package rnge
|
|
|
|
import (
|
|
"iter"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const RangeSeparatorCharacter = "-"
|
|
|
|
type Range interface {
|
|
InvalidIds() iter.Seq[int64]
|
|
Start() int64
|
|
End() int64
|
|
}
|
|
|
|
type rnge struct {
|
|
start int64
|
|
end int64
|
|
}
|
|
|
|
func From(rngeStr string) Range {
|
|
parts := strings.Split(strings.TrimSpace(rngeStr), RangeSeparatorCharacter)
|
|
start, _ := strconv.ParseInt(parts[0], 10, 64)
|
|
end, _ := strconv.ParseInt(parts[1], 10, 64)
|
|
|
|
return rnge{
|
|
start: start,
|
|
end: end,
|
|
}
|
|
}
|
|
|
|
func (r rnge) Start() int64 {
|
|
return r.start
|
|
}
|
|
|
|
func (r rnge) End() int64 {
|
|
return r.end
|
|
}
|
|
|
|
func (r rnge) InvalidIds() iter.Seq[int64] {
|
|
return func(yield func(int64) bool) {
|
|
for id := r.start; id <= r.end; id++ {
|
|
idStr := strconv.FormatInt(id, 10)
|
|
idLength := len(idStr)
|
|
|
|
if idLength%2 != 0 {
|
|
continue
|
|
}
|
|
|
|
midpoint := idLength / 2
|
|
firstHalf := idStr[:midpoint]
|
|
secondHalf := idStr[midpoint:]
|
|
|
|
if firstHalf != secondHalf {
|
|
continue
|
|
}
|
|
|
|
ok := yield(id)
|
|
|
|
if !ok {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|