diff --git a/slice/slice.go b/slice/slice.go index 138481c..9152d72 100644 --- a/slice/slice.go +++ b/slice/slice.go @@ -265,6 +265,22 @@ func flattenRecursive(value reflect.Value, result reflect.Value) reflect.Value { return result } +// ForEach iterates over elements of slice and invokes function for each element +// The function signature should be func(index int, value interface{}). +func ForEach(slice, function interface{}) { + sv := sliceValue(slice) + fn := functionValue(function) + + elemType := sv.Type().Elem() + if checkSliceCallbackFuncSignature(fn, elemType, nil) { + panic("function param should be of type func(int, " + elemType.String() + ")" + elemType.String()) + } + + for i := 0; i < sv.Len(); i++ { + fn.Call([]reflect.Value{reflect.ValueOf(i), sv.Index(i)}) + } +} + // Map creates an slice of values by running each element of `slice` thru `function`. // The function signature should be func(index int, value interface{}) interface{}. func Map(slice, function interface{}) interface{} { diff --git a/slice/slice_test.go b/slice/slice_test.go index 4fb0a0e..2e25613 100644 --- a/slice/slice_test.go +++ b/slice/slice_test.go @@ -235,6 +235,22 @@ func TestFlattenDeep(t *testing.T) { } } +func TestForEach(t *testing.T) { + numbers := []int{1, 2, 3, 4, 5} + expected := []int{3, 4, 5, 6, 7} + + var numbersAddTwo []int + ForEach(numbers, func(index int, value int) { + numbersAddTwo = append(numbersAddTwo, value+2) + }) + + if !reflect.DeepEqual(numbersAddTwo, expected) { + internal.LogFailedTestInfo(t, "ForEach", numbers, expected, numbersAddTwo) + t.FailNow() + } + +} + func TestMap(t *testing.T) { s1 := []int{1, 2, 3, 4} multiplyTwo := func(i, num int) int {