Commit 4bc2fd32 authored by Boris Mühmer (ADESTIS)'s avatar Boris Mühmer (ADESTIS) 💬
Browse files

added an interface, moved fibonacci numbrers to own file, and added a counter iterator

parent 0e606b96
Loading
Loading
Loading
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)
}
+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)
}
+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
}
+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()
		}
	}
}