This project aims to be the Scala Incubator project for Automatic-Resource-Management in the scala library
T[ManagedResource[U]]
to ManagedResource[T[U]]
for T <: Traversable
. However, this method relies on foldLeft
and flatMap
. This leads to StackOverflowError
if the input is too long. Do you know of any better way to do this?
case class ManagedResourceSequence[a](resource: Seq[a])
. Do you see any problems with this?
and
without flatMap
def sequenceManagedResources[R, T[X] <: TraversableOnce[X]](managedResources: T[ManagedResource[R]])(implicit canBuildFrom: CanBuildFrom[T[ManagedResource[R]], R, T[R]]): ManagedResource[T[R]] = {
val initialBuilderResource = unitManaged(canBuildFrom(managedResources))
val finalManagedBuilder = managedResources.foldLeft(initialBuilderResource) { case (builderResource, managedR) ⇒
builderResource.flatMap { builder ⇒
managedR.map(r ⇒ builder += r)
}
}
finalManagedBuilder.map(_.result())
}
def unitManaged[T](value: => T): ManagedResource[T] = {
managed(()).map(_ ⇒ value)
}
@Arty
to @Atry
in https://github.com/jsuereth/scala-arm/releases/tag/v2.0, please