Monday, February 27, 2023
HomeSoftware EngineeringThe right way to carry out Perform Iteration in Golang

# The right way to carry out Perform Iteration in Golang

## The problem#

The aim of this problem is to put in writing a higher-order operate returning a brand new operate that iterates on a specified operate a given variety of occasions. This new operate takes in an argument as a seed to start out the computation.

For example, take into account the operate `getDouble`. When run twice on worth `3`, yields `12` as proven beneath.

``````getDouble(3) => 6
getDouble(6) => 12
``````

Allow us to identify the brand new operate `createIterator` and we should always be capable of acquire the identical outcome utilizing `createIterator` as proven beneath:

``````var doubleIterator = createIterator(getDouble, 2); // Runs *getDouble* twice
doubleIterator(3) => 12
``````

For the sake of simplicity, all operate inputs to `createIterator` would operate returning a small quantity and the variety of iterations would at all times be integers.

Choice 1:

``````bundle resolution
func CreateIterator(fn func(int) int,n int) func(int) int {
return func (i int) int {
for j := 0; j < n; j++ { i = fn(i) }
return i
}
}
``````

Choice 2:

``````bundle resolution
func CreateIterator(fn func(int) int,n int) func(int) int {
if n == 0 {
return func(x int) int { return x } // id
} else {
return func(x int) int { return CreateIterator(fn, n-1)(fn(x)) }
}
}
``````

Choice 3:

``````bundle resolution
func CreateIterator(fn func(int) int,n int) func(int) int {
if n < 1 {
return nil
}
var retFunc = func(r int) int {
for i := n ; i>0 ; i-- {
r = fn(r)
}
return r
}
return retFunc
}
``````

## Check instances to validate our resolution#

``````bundle solution_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Iterator for 'getDouble' operate",func() {
var getDouble = func(n int) int {return 2*n}
It("Operating the iterator as soon as",func() {
doubleIterator := CreateIterator(getDouble,1)
Anticipate(doubleIterator(3)).To(Equal(6))
Anticipate(doubleIterator(5)).To(Equal(10))
})
It("Operating the iterator twice",func() {
})
})
``````
RELATED ARTICLES