Skip to content

Commit 7123a5a

Browse files
authored
Add ZLayer#toManaged (zio#8211)
1 parent f48a614 commit 7123a5a

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

managed-tests/shared/src/test/scala/zio/managed/ZManagedSpec.scala

+18-1
Original file line numberDiff line numberDiff line change
@@ -1844,7 +1844,24 @@ object ZManagedSpec extends ZIOBaseSpec {
18441844
_ <- endLatch.await
18451845
res <- release.get
18461846
} yield assertTrue(res)
1847-
}
1847+
},
1848+
suite("toManaged")(
1849+
test("preserve lifecycle of a layer converted to a managed value") {
1850+
def sideEffectingLayer(ref: Ref[Int]): ZLayer[Any, Nothing, String] =
1851+
ZLayer.scoped {
1852+
ZIO.scopeWith(_.addFinalizerExit(_ => ref.update(_ + 2)))
1853+
} >>>
1854+
ZLayer(ref.update(_ + 1).as("Howdy"))
1855+
1856+
for {
1857+
ref <- Ref.make(0)
1858+
res1 <- sideEffectingLayer(ref).toManaged.use { env =>
1859+
ref.get.map(_ -> env.get[String])
1860+
}
1861+
res2 <- ref.get
1862+
} yield assertTrue(res1._1 == 1) && assertTrue(res1._2 == "Howdy") && assertTrue(res2 == 3)
1863+
}
1864+
)
18481865
)
18491866

18501867
val ExampleError = new Throwable("Oh noes!")

managed/shared/src/main/scala/zio/managed/package.scala

+7
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ package object managed extends ZManagedCompatPlatformSpecific {
107107
ZManaged.fromReservationZIO(reservation).use(use)
108108
}
109109

110+
implicit final class ZManagedZLayerSyntax[R, E, A](private val self: ZLayer[R, E, A]) extends AnyVal {
111+
112+
/** Converts this layer to a ZManaged value. */
113+
def toManaged(implicit trace: Trace): ZManaged[R, E, ZEnvironment[A]] =
114+
ZManaged.scoped[R](self.build)
115+
}
116+
110117
implicit final class ZManagedZLayerCompanionSyntax(private val self: ZLayer.type) extends AnyVal {
111118

112119
/**

0 commit comments

Comments
 (0)