add ranger
This commit is contained in:
84
ranger/range.go
Normal file
84
ranger/range.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package main
|
||||
|
||||
// export GOEXPERIMENT=rangefunc
|
||||
import "iter"
|
||||
|
||||
func Step(start, stop, step int) iter.Seq[int] {
|
||||
if step < 0 {
|
||||
return func(yield func(int) bool) {
|
||||
for i := start; i <= start && i > stop; i += step {
|
||||
next := yield(i)
|
||||
if !next {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if step > 0 {
|
||||
return func(yield func(int) bool) {
|
||||
for i := start; i >= start && i < stop; i += step {
|
||||
next := yield(i)
|
||||
if !next {
|
||||
println("stopped!")
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return func(yield func(int) bool) { yield(start) }
|
||||
}
|
||||
|
||||
func Fib() iter.Seq[uint] {
|
||||
return func(yield func(uint) bool) {
|
||||
previous, value := uint(1), uint(1)
|
||||
next := yield(value)
|
||||
for next {
|
||||
next = yield(value)
|
||||
value, previous = value+previous, value
|
||||
if value < previous {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Fizzbuzzed[T int | uint](from iter.Seq[T]) iter.Seq2[T, string] {
|
||||
pull, stop := iter.Pull(from)
|
||||
return func(yield func(T, string) bool) {
|
||||
defer stop()
|
||||
for {
|
||||
var fizzbuzz string
|
||||
p, ok := pull()
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
if p%3 == 0 {
|
||||
fizzbuzz = "fizz"
|
||||
}
|
||||
if p%5 == 0 {
|
||||
fizzbuzz += "buzz"
|
||||
}
|
||||
if !yield(p, fizzbuzz) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// func main() {
|
||||
// for i, v := range Fizzbuzzed(Fib()) {
|
||||
// println(i, v)
|
||||
// }
|
||||
// }
|
||||
|
||||
func countScan(n int) (func() bool, func() int) {
|
||||
pos := -1
|
||||
return func() bool {
|
||||
pos++
|
||||
return pos < n
|
||||
}, func() int {
|
||||
return pos
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user