---
name: map_concurrent
kind: function
lang: go
domain: core
version: "1.0.0"
purity: impure
signature: "func MapConcurrent[T any, U any](xs []T, fn func(T) U, workers int) []U"
description: "Aplica una funcion a cada elemento de un slice usando un pool de goroutines como workers. Los resultados preservan el orden original del slice de entrada."
tags: [map, concurrent, parallel, generic]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
params:
  - name: xs
    desc: "slice de elementos a procesar"
  - name: fn
    desc: "función a aplicar a cada elemento"
  - name: workers
    desc: "número de goroutines concurrentes; se ajusta a max(1, min(workers, len(xs)))"
output: "slice de resultados en el mismo orden original que la entrada"
tested: false
tests: []
test_file_path: ""
file_path: "functions/core/map_concurrent.go"
---

## Ejemplo

```go
squares := MapConcurrent([]int{1, 2, 3, 4, 5}, func(n int) int {
    return n * n
}, 3)
// squares = [1, 4, 9, 16, 25] (orden preservado)
```

## Notas

Funcion impura generica que usa goroutines y sync.WaitGroup. Los workers se alimentan de un canal con indices, garantizando que cada resultado se escribe en su posicion correcta sin race conditions (cada goroutine escribe en un indice unico). Si workers <= 0 se usa 1. Si workers > len(xs) se ajusta a len(xs).
