Skip to content

Instantly share code, notes, and snippets.

@whitekid
Created October 22, 2024 08:01
Show Gist options
  • Save whitekid/f732cb54ab33352c5f96444310c29321 to your computer and use it in GitHub Desktop.
Save whitekid/f732cb54ab33352c5f96444310c29321 to your computer and use it in GitHub Desktop.
chunk to sub iterator
package iterx
import (
"iter"
)
func Chunk[T any](s iter.Seq[T], size int) iter.Seq[iter.Seq[T]] {
return func(yield func(iter.Seq[T]) bool) {
next, stop := iter.Pull(s)
defer stop()
stopIt := false
for !stopIt {
v, ok := next()
if !ok {
return
}
if !yield(func(yield func(T) bool) {
if !yield(v) {
return
}
for i := 0; i < size-1; i++ {
v, ok := next()
if !ok {
stopIt = true
return
}
if !yield(v) {
stopIt = true
return
}
}
}) {
return
}
}
}
}
func Chunk2[T1 any, T2 any](s iter.Seq2[T1, T2], size int) iter.Seq[iter.Seq2[T1, T2]] {
return func(yield func(iter.Seq2[T1, T2]) bool) {
next, stop := iter.Pull2(s)
defer stop()
stopIt := false
for !stopIt {
v1, v2, ok := next()
if !ok {
return
}
if !yield(func(yield func(T1, T2) bool) {
if !yield(v1, v2) {
return
}
for i := 0; i < size-1; i++ {
v1, v2, ok := next()
if !ok {
stopIt = true
return
}
if !yield(v1, v2) {
stopIt = true
return
}
}
}) {
return
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment