From b3b891481c8db2123085f8a41c73e566dc7ab8f6 Mon Sep 17 00:00:00 2001 From: Adam Fraser Date: Thu, 20 Aug 2020 22:08:46 -0700 Subject: [PATCH] implement ZLayer#project --- core-tests/shared/src/test/scala/zio/ZLayerSpec.scala | 6 ++++++ core/shared/src/main/scala/zio/ZLayer.scala | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/core-tests/shared/src/test/scala/zio/ZLayerSpec.scala b/core-tests/shared/src/test/scala/zio/ZLayerSpec.scala index 1d68162dd283..f1cae0d68926 100644 --- a/core-tests/shared/src/test/scala/zio/ZLayerSpec.scala +++ b/core-tests/shared/src/test/scala/zio/ZLayerSpec.scala @@ -376,6 +376,12 @@ object ZLayerSpec extends ZIOBaseSpec { val layer4 = ZLayer.fromAcquireRelease(sleep)(_ => sleep) val env = layer1 ++ ((layer2 ++ layer3) >+> layer4) assertM(ZIO.unit.provideCustomLayer(env).run)(fails(equalTo("foo"))) + }, + testM("project") { + final case class Person(name: String, age: Int) + val personLayer = ZLayer.succeed(Person("User", 42)) + val ageLayer = personLayer.project(_.age) + assertM(ZIO.service[Int].provideLayer(ageLayer))(equalTo(42)) } ) } diff --git a/core/shared/src/main/scala/zio/ZLayer.scala b/core/shared/src/main/scala/zio/ZLayer.scala index 5298b195e964..e8c50735e00f 100644 --- a/core/shared/src/main/scala/zio/ZLayer.scala +++ b/core/shared/src/main/scala/zio/ZLayer.scala @@ -2204,6 +2204,16 @@ object ZLayer { ZLayer.identity[RIn] ++ self } + implicit final class ZLayerProjectOps[R, E, A](private val self: ZLayer[R, E, Has[A]]) extends AnyVal { + + /** + * Projects out part of one of the layers output by this layer using the + * specified function + */ + final def project[B: Tag](f: A => B)(implicit tag: Tag[A]): ZLayer[R, E, Has[B]] = + self >>> ZLayer.fromFunction(r => f(r.get)) + } + /** * A `MemoMap` memoizes dependencies. */