github.com/biogo/biogo@v1.0.4/concurrent/lazy.go (about) 1 // Copyright ©2011-2012 The bíogo Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package concurrent 6 7 // Evaluator is a function for lazy evaluation. 8 type Evaluator func(...interface{}) (interface{}, State) 9 10 type State []interface{} 11 12 // Lazily is function to generate a lazy evaluator. 13 // 14 // Lazy functions are terminated by closing the reaper channel. nil should be passed as 15 // a reaper for perpetual lazy functions. 16 func Lazily(f Evaluator, lookahead int, reaper <-chan struct{}, init ...interface{}) func() interface{} { 17 rc := make(chan interface{}, lookahead) 18 go func(rc chan interface{}) { 19 defer close(rc) 20 var state State = init 21 var result interface{} 22 23 for { 24 result, state = f(state...) 25 select { 26 case rc <- result: 27 case <-reaper: 28 return 29 } 30 } 31 }(rc) 32 33 return func() interface{} { 34 return <-rc 35 } 36 }