@@ -13,6 +13,8 @@ import java.net.URLClassLoader
1313import java .io .File
1414
1515import cats .data .Xor
16+ import cats .std .list ._
17+ import cats .syntax .monadCombine ._
1618import org .clapper .classutil .ClassFinder
1719import org .scalaexercises .evaluator .Dependency
1820
@@ -40,24 +42,18 @@ object Exercises {
4042 loop(cl, Nil )
4143 }
4244
43- def discoverLibraries (cl : ClassLoader = classOf [Exercise ].getClassLoader) = {
45+ def discoverLibraries (cl : ClassLoader = classOf [Exercise ].getClassLoader): ( List [ String ], List [ Library ]) = {
4446 val classNames : List [String ] = subclassesOf[Library ](cl)
4547
46- val (errors, libraries) = classNames.foldLeft(( Nil : List [ String ], Nil : List [ Library ])) { (acc, name) ⇒
47- val loadedLibrary = for {
48+ val errorsAndLibraries = classNames.map { name ⇒
49+ for {
4850 loadedClass ← guard(Class .forName(name, true , cl), s " $name not found " )
4951 loadedObject ← guard(loadedClass.getField(" MODULE$" ).get(null ), s " $name must be defined as an object " )
5052 loadedLibrary ← guard(loadedObject.asInstanceOf [Library ], s " $name must extend Library " )
5153 } yield loadedLibrary
52-
53- // until a bifoldable exists in Cats...
54- loadedLibrary match {
55- case Xor .Right (c) ⇒ (acc._1, c :: acc._2)
56- case Xor .Left (e) ⇒ (e :: acc._1, acc._2)
57- }
5854 }
5955
60- (errors, libraries)
56+ errorsAndLibraries.separate
6157 }
6258
6359 private def guard [A ](f : ⇒ A , message : ⇒ String ) =
0 commit comments