From 8b6e959d11a85f4290ae4204296eedda7ae902dd Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Fri, 14 Mar 2025 18:25:35 +0000 Subject: [PATCH] feat: parTraverse -> fs2 --- project.scala | 2 ++ src/main/wacc/Main.scala | 11 +++++++++-- src/main/wacc/frontend/semantics.scala | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/project.scala b/project.scala index 8edf035..ee9d2f7 100644 --- a/project.scala +++ b/project.scala @@ -13,6 +13,8 @@ //> using dep org.slf4j:slf4j-simple:2.0.17 //> using test.dep org.scalatest::scalatest::3.2.19 //> using dep org.typelevel::cats-effect-testing-scalatest::1.6.0 +//> using dep "co.fs2::fs2-core:3.11.0" +//> using dep co.fs2::fs2-io:3.11.0 // sensible defaults for warnings and compiler checks //> using options -deprecation -unchecked -feature diff --git a/src/main/wacc/Main.scala b/src/main/wacc/Main.scala index c29de9d..a778a07 100644 --- a/src/main/wacc/Main.scala +++ b/src/main/wacc/Main.scala @@ -15,6 +15,8 @@ import com.monovore.decline.effect._ import org.typelevel.log4cats.slf4j.Slf4jLogger import org.typelevel.log4cats.Logger +import fs2.Stream + import assemblyIR as asm import cats.data.ValidatedNel import java.io.File @@ -147,8 +149,13 @@ def compileCommandParallel( log: Boolean, outDir: Option[Path] ): IO[ExitCode] = - files - .parTraverse { file => compile(file.toAbsolutePath, outDir, log) } + Stream + .emits(files.toList) + .parEvalMapUnordered(Runtime.getRuntime.availableProcessors()) { file => + compile(file.toAbsolutePath, outDir, log) + } + .compile + .toList .map { exitCodes => exitCodes.filter(_ != 0) match { case Nil => ExitCode.Success diff --git a/src/main/wacc/frontend/semantics.scala b/src/main/wacc/frontend/semantics.scala index 9578e8a..6940e45 100644 --- a/src/main/wacc/frontend/semantics.scala +++ b/src/main/wacc/frontend/semantics.scala @@ -27,7 +27,7 @@ object semantics { toRename = (main +: chunks).toList res <- toRename .zip(scope.subscopes(toRename.size)) - .parTraverse(checkFunc) + .traverse(checkFunc) (typedChunks, errors) = res.foldLeft((Chain.empty[microWacc.FuncDecl], Chain.empty[Error])) { case ((acc, err), (funcDecl, errors)) => (acc :+ funcDecl, err ++ errors)