turbolift.io.ResourceFactory.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of turbolift-core_3 Show documentation
Show all versions of turbolift-core_3 Show documentation
Algebraic Effects for Scala 3
The newest version!
package turbolift.io
import java.io.{Closeable => JCloseable}
import turbolift.!!
import turbolift.effects.{IO, Finalizer}
/** To be used with [[turbolift.effects.FinalizerEffect FinalizerEffect]]. */
trait ResourceFactory[A, U]:
def acquire: A !! U
def release(value: A): Unit !! U
object ResourceFactory:
def apply[A, U](acquire: A !! U, release: A => Unit !! U): ResourceFactory[A, U] =
val acq = acquire
val rel = release
new ResourceFactory[A, U]:
override def acquire = acq
override def release(a: A) = rel(a)
extension [A](thiz: ResourceFactory[A, IO])
def use: A !! Finalizer = Finalizer.use(thiz)
trait Closeable[A <: JCloseable] extends ResourceFactory[A, IO]:
final override def release(a: A): Unit !! IO = IO(a.close)