Go の例(5)
Go の例についても同様に修正します。
UnfoldL 関数を作成します。
func UnfoldL(f func(*Numbers) (int, *Numbers), init *Numbers) *IteratorSimpleImpl_int { src := init dst := 0 next := func() bool { dst, src = f(src) return true } getCurrent := func() int { return dst } setCurrent := func(val int) { } return newIteratorSimpleImpl_int(next, getCurrent, setCurrent) }
ゴルーチン版では UnfoldL 関数は以下のようにします。
func UnfoldL(f func(*Numbers) (int, *Numbers), init *Numbers) *IteratorChannelImpl_int { src := init dst := 0 ch := make(chan int) serv := func(ch chan int) { for { dst, src = f(src) ch <- dst } } go serv(ch) return newIteratorChannelImpl_int(ch) }
NextNumbers を以下の NextDigitAndNumbers で置き換えます。
func NextDigitAndNumbers(numbers *Numbers) (int, *Numbers) { numbers_copy := numbers.Copy() dd := numbers_copy.GetNextDecimalDigit() return dd, numbers_copy }
Calc クラスの IterateServer メソッドは以下のように UnfoldL を使うように変更します。
func (xyz *Calc) IterateServer() string { number := newLongDecimal([]int{}) square_difference := newLongDecimal([]int{3}) init_numbers := newNumbers(number, square_difference, 0) dec := UnfoldL(NextDigitAndNumbers, init_numbers).Take(xyz.count) return newLongDecimal(dec).Print() }