Los iteradores de Nyx son cadenas perezosas de transformaciones. Llamar .iter() sobre un array crea un iterador, .filter(pred) conserva solo los elementos que satisfacen un predicado, .map(f) transforma cada elemento, y .collect() materializa el resultado en un nuevo array.
// Iterators: filter + map + collect en cadena fn is_even(x: int) -> bool { return x % 2 == 0 } fn double(x: int) -> int { return x * 2 } fn square(x: int) -> int { return x * x } fn main() -> int { let nums: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] // Filtrar pares y duplicarlos let result: Array = nums.iter().filter(is_even).map(double).collect() print("pares duplicados: " + int_to_string(result.length()) + " elementos") let r0: int = result[0] let r4: int = result[4] print("primero: " + int_to_string(r0)) // 4 (2*2) print("ultimo: " + int_to_string(r4)) // 20 (10*2) // Solo map: elevar al cuadrado todos let squares: Array = nums.iter().map(square).collect() print("cuadrados: " + int_to_string(squares.length()) + " elementos") let s0: int = squares[0] let s9: int = squares[9] print("1^2 = " + int_to_string(s0)) print("10^2 = " + int_to_string(s9)) // Filtrar, mapear y tomar los primeros 3 let top3: Array = nums.iter().filter(is_even).map(double).take(3).collect() print("top3 pares*2:") let t0: int = top3[0] let t1: int = top3[1] let t2: int = top3[2] print(int_to_string(t0) + " " + int_to_string(t1) + " " + int_to_string(t2)) return 0 }
pares duplicados: 5 elementos primero: 4 ultimo: 20 cuadrados: 10 elementos 1^2 = 1 10^2 = 100 top3 pares*2: 4 8 12
Cómo funciona
Los pipelines de iteradores en Nyx siguen un patrón consistente: empiezan con .iter(), encadenan cero o más adaptadores intermedios (filter, map, take, skip, etc.), y terminan con un consumidor (collect, fold, for_each). Cada adaptador es perezoso — ningún elemento se procesa hasta que el consumidor impulsa el pipeline. Esto evita alocar arrays intermedios en cada paso.
El primer pipeline, nums.iter().filter(is_even).map(double).collect(), recorre los 10 números: filter deja pasar solo los 5 pares (2, 4, 6, 8, 10), y luego map duplica cada uno, produciendo [4, 8, 12, 16, 20]. Las funciones pasadas a filter y map son funciones de nivel superior nombradas aquí, pero las closures funcionan igual de bien.
Agregar .take(3) a la cadena detiene el pipeline después de recolectar los primeros tres resultados, así que el tercer ejemplo produce [4, 8, 12] sin procesar los elementos restantes. Esta composabilidad — combinar filter, map, take y otros adaptadores en cualquier orden — es la fortaleza central del diseño de iteradores de Nyx.