From ef09b62f3c0a8fddb980f4e43e6e741abc999419 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 8 Jul 2015 11:47:02 +0100 Subject: [PATCH] Minor refactoring in CachePolicy Preparing the ground for TTLs --- .../scala/coursier/core/MavenRepository.scala | 8 +++- .../main/scala/coursier/core/Repository.scala | 43 +++++++++++-------- files/src/main/scala/coursier/Files.scala | 7 ++- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/core-jvm/src/main/scala/coursier/core/MavenRepository.scala b/core-jvm/src/main/scala/coursier/core/MavenRepository.scala index 9fb150d84..c7665d1ed 100644 --- a/core-jvm/src/main/scala/coursier/core/MavenRepository.scala +++ b/core-jvm/src/main/scala/coursier/core/MavenRepository.scala @@ -80,7 +80,13 @@ case class MavenRepository( ) } - EitherT(cachePolicy.saving(locally(localFile))(remote)(save)) + EitherT( + cachePolicy[String \/ String]( + _.isLeft )( + locally(localFile) )( + _ => CachePolicy.saving(remote)(save) + ) + ) } } diff --git a/core/src/main/scala/coursier/core/Repository.scala b/core/src/main/scala/coursier/core/Repository.scala index 7283f244c..e0e570920 100644 --- a/core/src/main/scala/coursier/core/Repository.scala +++ b/core/src/main/scala/coursier/core/Repository.scala @@ -455,18 +455,18 @@ abstract class BaseMavenRepository( } sealed trait CachePolicy { - def apply[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]): Task[E \/ T] - - def saving[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]) - (save: => T => Task[Unit]): Task[E \/ T] = - apply(local)(CachePolicy.saving(remote)(save)) + def apply[T]( + tryRemote: T => Boolean )( + local: => Task[T] )( + remote: Option[T] => Task[T] + ): Task[T] } object CachePolicy { - def saving[E,T](remote: => Task[E \/ T]) - (save: T => Task[Unit]): Task[E \/ T] = { + def saving[E,T]( + remote: => Task[E \/ T] )( + save: T => Task[Unit] + ): Task[E \/ T] = { for { res <- remote _ <- res.fold(_ => Task.now(()), t => save(t)) @@ -474,19 +474,28 @@ object CachePolicy { } case object Default extends CachePolicy { - def apply[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]): Task[E \/ T] = + def apply[T]( + tryRemote: T => Boolean )( + local: => Task[T] )( + remote: Option[T] => Task[T] + ): Task[T] = local - .flatMap(res => if (res.isLeft) remote else Task.now(res)) + .flatMap(res => if (tryRemote(res)) remote(Some(res)) else Task.now(res)) } case object LocalOnly extends CachePolicy { - def apply[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]): Task[E \/ T] = + def apply[T]( + tryRemote: T => Boolean )( + local: => Task[T] )( + remote: Option[T] => Task[T] + ): Task[T] = local } case object ForceDownload extends CachePolicy { - def apply[E,T](local: => Task[E \/ T]) - (remote: => Task[E \/ T]): Task[E \/ T] = - remote + def apply[T]( + tryRemote: T => Boolean )( + local: => Task[T] )( + remote: Option[T] => Task[T] + ): Task[T] = + remote(None) } } diff --git a/files/src/main/scala/coursier/Files.scala b/files/src/main/scala/coursier/Files.scala index 1bc4b8ed3..e64e0e690 100644 --- a/files/src/main/scala/coursier/Files.scala +++ b/files/src/main/scala/coursier/Files.scala @@ -143,8 +143,11 @@ case class Files( val tasks = for ((f, url) <- pairs if url != ("file:" + f) && url != ("file://" + f)) yield { val file = new File(f) - cachePolicy(locally(file))(remote(file, url)) - .map(e => (file, url) -> e.map(_ => ())) + cachePolicy[FileError \/ File]( + _.isLeft )( + locally(file) )( + _ => remote(file, url) + ).map(e => (file, url) -> e.map(_ => ())) } Nondeterminism[Task].gather(tasks)