func (s Sequence) Range(start T, end T, step T) chan T {
	c := make(chan T, 1)
	pos := start <= end
	go func() {
		for pos && (start < end) || !pos && (start > end) {
			c <- start
			start += step
		}
		close(c)
	}()
	return c
}
Range generates elements from start to end with given step
package implementation
import "context"
type Sequence struct {
	ctx context.Context
}
func (s Sequence) Count(start T, step T) chan T {
	c := make(chan T, 1)
	go func() {
		defer close(c)
		for {
			select {
			case <-s.ctx.Done():
				return
			case c <- start:
				start += step
			}
		}
	}()
	return c
}
func (s Sequence) Exponential(start T, factor T) chan T {
	c := make(chan T, 1)
	go func() {
		defer close(c)
		for {
			select {
			case <-s.ctx.Done():
				return
			case c <- start:
				start *= factor
			}
		}
	}()
	return c
}
func (s Sequence) Iterate(val T, f func(val T) T) chan T {
	c := make(chan T, 1)
	go func() {
		defer close(c)
		for {
			select {
			case <-s.ctx.Done():
				return
			case c <- val:
				val = f(val)
			}
		}
	}()
	return c
}