Skip to content
Snippets Groups Projects
Select Git revision
  • feature/v1.3.60
  • develop default protected
  • main protected
  • release/v1.0.7
  • release/v1.0.0
  • feature/v0.9.5
  • release/v0.6.2
  • hotfix/v0.5.7
  • release/v0.5.6
  • release/v0.5.5
  • hotfix/v0.5.4
  • hotfix/v0.5.3
  • hotfix/v0.5.2
  • release/v0.5.1
  • hotfix/v0.5.0
  • hotfix/v0.4.9
  • hotfix/v0.4.8
  • hotfix/v0.4.7
  • release/v0.4.6
  • hotfix/v0.4.5
  • v1.3.55
  • v1.3.52
  • v1.3.50
  • v1.3.45
  • v1.3.42
  • v1.3.41
  • v1.3.40
  • v1.3.38
  • v1.3.37
  • v1.3.36
  • v1.3.35
  • v1.3.34
  • v1.3.33
  • v1.3.32
  • v1.3.31
  • v1.3.30
  • v1.3.29
  • v1.3.28
  • v1.3.27
  • v1.3.26
40 results

AnyLinesProcessAsyncUsingProcessor.go

AnyLinesProcessAsyncUsingProcessor.go 913 B
package stringslice

import (
	"reflect"
	"sync"

	"gitlab.com/evatix-go/core/constants"
)

func AnyLinesProcessAsyncUsingProcessor(
	lines interface{},
	lineProcessor func(index int, lineIn interface{}) (lineOut string),
) []string {
	if lines == nil {
		return []string{}
	}

	reflectType := reflect.TypeOf(lines)
	kind := reflectType.Kind()
	isArrayOrSlice := kind == reflect.Slice ||
		kind == reflect.Array

	if !isArrayOrSlice {
		return []string{}
	}

	reflectValue := reflect.ValueOf(lines)
	length := reflectValue.Len()

	if length == 0 {
		return []string{}
	}

	slice := Make(constants.Zero, length)
	wg := sync.WaitGroup{}

	wg.Add(length)

	asyncProcessor := func(index int, lineIn interface{}) {
		slice[index] = lineProcessor(index, lineIn)

		wg.Done()
	}

	for i := 0; i < length; i++ {
		itemAt := reflectValue.Index(i)
		go asyncProcessor(i, itemAt.Interface())
	}

	wg.Wait()

	return slice
}