zio.stream.ZStreamVersionSpecific.scala Maven / Gradle / Ivy
package zio.stream
import zio.ZLayer
import zio.internal.macros.LayerMacros
trait ZStreamVersionSpecific[-R, +E, +O] { self: ZStream[R, E, O] =>
/**
* Automatically assembles a layer for the ZStream effect, which translates it
* to another level.
*/
inline def provide[E1 >: E](inline layer: ZLayer[_, E1, _]*): ZStream[Any, E1, O] =
${ ZStreamProvideMacro.provideImpl[Any, R, E1, O]('self, 'layer) }
}
object ZStreamProvideMacro {
import scala.quoted._
def provideImpl[R0: Type, R: Type, E: Type, A: Type](
zstream: Expr[ZStream[R, E, A]],
layer: Expr[Seq[ZLayer[_, E, _]]]
)(using Quotes): Expr[ZStream[R0, E, A]] = {
val layerExpr = LayerMacros.constructLayer[R0, R, E](layer)
'{ $zstream.provideLayer($layerExpr.asInstanceOf[ZLayer[R0, E, R]]) }
}
}