Loading iterators/counter.go 0 → 100644 +31 −0 Original line number Diff line number Diff line package iterators import ( "math/big" ) // Counter ... type Counter struct { count *big.Int } // NewCounterIterator ... func NewCounterIterator(start *big.Int) *Counter { return &Counter{ count: start, } } // Value ... func (c *Counter) Value() *big.Int { return c.count } var ( one = big.NewInt(1) ) // Next ... func (c *Counter) Next() { c.count.Add(c.count, one) } iterators/fibonaccinumber.go 0 → 100644 +31 −0 Original line number Diff line number Diff line package iterators import ( "math/big" ) // https://en.wikipedia.org/wiki/Fibonacci_number // FibonacciNumber ... type FibonacciNumber struct { current *big.Int next *big.Int } // NewFibonacciNumberIterator ... func NewFibonacciNumberIterator() *FibonacciNumber { return &FibonacciNumber{ current: big.NewInt(0), next: big.NewInt(1), } } // Value ... func (fn *FibonacciNumber) Value() *big.Int { return fn.current } // Next ... func (fn *FibonacciNumber) Next() { fn.current, fn.next = fn.next, fn.current.Add(fn.next, fn.current) } iterators/iterators.go +8 −26 Original line number Diff line number Diff line package iterators import "math/big" // https://en.wikipedia.org/wiki/Fibonacci_number // FibonacciNumber ... type FibonacciNumber struct { current *big.Int next *big.Int } // NewFibonacciNumberIterator ... func NewFibonacciNumberIterator() *FibonacciNumber { return &FibonacciNumber{ current: big.NewInt(0), next: big.NewInt(1), } } // Value ... func (fn *FibonacciNumber) Value() *big.Int { return fn.current } // Next ... func (fn *FibonacciNumber) Next() { fn.current, fn.next = fn.next, fn.current.Add(fn.next, fn.current) import ( "math/big" ) // BigIntIterator is an iterator for big.Ints. type BigIntIterator interface { Next() Value() *big.Int } iterators/iterators_test.go +16 −3 Original line number Diff line number Diff line package iterators import ( "math/big" "testing" ) func TestIterators1(t *testing.T) { fn := NewFibonacciNumberIterator() var iter BigIntIterator = NewFibonacciNumberIterator() for i := 0; i < 20; i++ { t.Logf("F(%d): %s", i, fn.Value()) fn.Next() t.Logf("F(%d): %s", i, iter.Value()) iter.Next() } } func TestIterators2(t *testing.T) { for i, iter := range []BigIntIterator{ NewCounterIterator(big.NewInt(10)), NewFibonacciNumberIterator(), } { for j := 0; j < 20; j++ { t.Logf("F%d(%d): %s", i, j, iter.Value()) iter.Next() } } } Loading
iterators/counter.go 0 → 100644 +31 −0 Original line number Diff line number Diff line package iterators import ( "math/big" ) // Counter ... type Counter struct { count *big.Int } // NewCounterIterator ... func NewCounterIterator(start *big.Int) *Counter { return &Counter{ count: start, } } // Value ... func (c *Counter) Value() *big.Int { return c.count } var ( one = big.NewInt(1) ) // Next ... func (c *Counter) Next() { c.count.Add(c.count, one) }
iterators/fibonaccinumber.go 0 → 100644 +31 −0 Original line number Diff line number Diff line package iterators import ( "math/big" ) // https://en.wikipedia.org/wiki/Fibonacci_number // FibonacciNumber ... type FibonacciNumber struct { current *big.Int next *big.Int } // NewFibonacciNumberIterator ... func NewFibonacciNumberIterator() *FibonacciNumber { return &FibonacciNumber{ current: big.NewInt(0), next: big.NewInt(1), } } // Value ... func (fn *FibonacciNumber) Value() *big.Int { return fn.current } // Next ... func (fn *FibonacciNumber) Next() { fn.current, fn.next = fn.next, fn.current.Add(fn.next, fn.current) }
iterators/iterators.go +8 −26 Original line number Diff line number Diff line package iterators import "math/big" // https://en.wikipedia.org/wiki/Fibonacci_number // FibonacciNumber ... type FibonacciNumber struct { current *big.Int next *big.Int } // NewFibonacciNumberIterator ... func NewFibonacciNumberIterator() *FibonacciNumber { return &FibonacciNumber{ current: big.NewInt(0), next: big.NewInt(1), } } // Value ... func (fn *FibonacciNumber) Value() *big.Int { return fn.current } // Next ... func (fn *FibonacciNumber) Next() { fn.current, fn.next = fn.next, fn.current.Add(fn.next, fn.current) import ( "math/big" ) // BigIntIterator is an iterator for big.Ints. type BigIntIterator interface { Next() Value() *big.Int }
iterators/iterators_test.go +16 −3 Original line number Diff line number Diff line package iterators import ( "math/big" "testing" ) func TestIterators1(t *testing.T) { fn := NewFibonacciNumberIterator() var iter BigIntIterator = NewFibonacciNumberIterator() for i := 0; i < 20; i++ { t.Logf("F(%d): %s", i, fn.Value()) fn.Next() t.Logf("F(%d): %s", i, iter.Value()) iter.Next() } } func TestIterators2(t *testing.T) { for i, iter := range []BigIntIterator{ NewCounterIterator(big.NewInt(10)), NewFibonacciNumberIterator(), } { for j := 0; j < 20; j++ { t.Logf("F%d(%d): %s", i, j, iter.Value()) iter.Next() } } }