 Documentation
      ¶
      Documentation
      ¶
    
    
  
    
  
    Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
        
          
            func GeneratorVariadicFunc
            deprecated
            
          
  
    
  
      
      func GeneratorVariadicFunc(f func(yield Yield, args ...interface{})) func(args ...interface{}) *Generator
Deprecated: Use GeneratorFunc wrapped by closure instead.
Example ¶
package main
import (
	"fmt"
	"github.com/searKing/golang/go/go/generator"
)
func main() {
	g := func(i int) *generator.Generator {
		g := generator.GeneratorVariadicFunc(func(yield generator.Yield, args ...interface{}) {
			i := (args[0]).(int)
			if !yield(i) {
				return
			}
			if !yield(i + 10) {
				return
			}
		})
		gen := g(i)
		return gen
	}
	gen := g(10)
	for msg := range gen.C {
		fmt.Println(msg)
	}
}
Output: 10 20
Types ¶
type Generator ¶
type Generator struct {
	// Used by Next, to notify or deliver what is generated, as next in python or ES6
	C <-chan interface{}
	// contains filtered or unexported fields
}
    Generator behaves like Generator in python or ES6 Generator function contains one or more yield statement. Generator functions allow you to declare a function that behaves like an iterator, i.e. it can be used in a for loop. see https://wiki.python.org/moin/Generators see https://www.programiz.com/python-programming/generator see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
func GeneratorFunc ¶
GeneratorFunc returns an object (iterator) which we can iterate over (one value at a time). It returns a Generator that can be used to cancel the call using its Stop method. Iterate will be stopped when f is return or Stop is called.
Example ¶
package main
import (
	"fmt"
	"github.com/searKing/golang/go/go/generator"
)
func main() {
	g := func(i int) *generator.Generator {
		return generator.GeneratorFunc(func(yield generator.Yield) {
			if !yield(i) {
				return
			}
			if !yield(i + 10) {
				return
			}
		})
	}
	gen := g(10)
	for msg := range gen.C {
		fmt.Println(msg)
	}
}
Output: 10 20
func GeneratorFuncWithSupplier ¶
func GeneratorFuncWithSupplier(supplierC <-chan interface{}, f func(msg interface{})) *Generator
    GeneratorFuncWithSupplier waits for the supplierC to supply and then calls f in its own goroutine every time. It returns a Generator that can be used to cancel the call using its Stop method. Consume will be stopped when supplierC is closed.
func GeneratorWithSupplier ¶
func GeneratorWithSupplier(supplierC <-chan interface{}) *Generator
    GeneratorWithSupplier is like GeneratorFunc. But it's data src is from supplierC. Iterate will be stopped when supplierC is closed or Stop is called.
Example ¶
package main
import (
	"fmt"
	"github.com/searKing/golang/go/go/generator"
)
func main() {
	var g *generator.Generator
	supplierC := make(chan interface{})
	supplierF := func(i int) {
		consumer := g.Yield(supplierC)
		if !consumer(i) {
			return
		}
		if !consumer(i + 10) {
			return
		}
		close(supplierC)
	}
	g = generator.GeneratorWithSupplier(supplierC)
	go supplierF(10)
	for msg := range g.C {
		fmt.Println(msg)
	}
}
Output: 10 20
func (*Generator) Next ¶
Next behaves like an iterator, i.e. it can be used in a for loop. It's a grammar sugar for chan
Example ¶
package main
import (
	"fmt"
	"github.com/searKing/golang/go/go/generator"
)
func main() {
	g := func(i int) *generator.Generator {
		return generator.GeneratorFunc(func(yield generator.Yield) {
			if !yield(i) {
				return
			}
			if !yield(i + 10) {
				return
			}
		})
	}
	gen := g(10)
	for {
		msg, ok := gen.Next()
		if !ok {
			return
		}
		fmt.Println(msg)
	}
}
Output: 10 20
func (*Generator) Stop ¶
Stop prevents the Generator from firing, with the channel drained. Stop ensures the channel is empty after a call to Stop. It returns true if the call stops the generator, false if the generator has already expired or been stopped. Stop does not close the channel, to prevent a read from the channel succeeding incorrectly.
This cannot be done concurrent to other receives from the Generator's channel.
For a generator created with GeneratorFuncWithSupplier(supplierC, f), if t.Stop returns false, then the generator has already expired and the function f has been started in its own goroutine; Stop does not wait for f to complete before returning. If the caller needs to know whether f is completed, it must coordinate with f explicitly.
func (*Generator) Yield ¶
Yield is a grammar sugar for data src of generator ok returns true if msg sent; false if consume canceled If a function contains at least one yield statement (it may contain other yield or return statements), it becomes a generator function. Both yield and return will return some value from a function. The difference is that, while a return statement terminates a function entirely, yield statement pauses the function saving all its states and later continues from there on successive calls.