All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalaz.effect.Dup.scala Maven / Gradle / Ivy

package scalaz
package effect

/**Duplicate a handle in the parent region. */
trait Dup[H[_[_]]] {
  def dup[PP[_]: MonadIO, CS, PS]: H[RegionT[CS, RegionT[PS, PP, ?], ?]] => RegionT[CS, RegionT[PS, PP, ?], H[RegionT[PS, PP, ?]]]
}

sealed abstract class DupInstances {
  import Dup._

  implicit val FinalizerHandleDup: Dup[FinalizerHandle] =
    new Dup[FinalizerHandle] {
      def dup[PP[_] : MonadIO, CS, PS]: FinalizerHandle[RegionT[CS, RegionT[PS, PP, ?], ?]] => RegionT[CS, RegionT[PS, PP, ?], FinalizerHandle[RegionT[PS, PP, ?]]] = h =>
        RegionT[CS, RegionT[PS, PP, ?], FinalizerHandle[RegionT[PS, PP, ?]]](
          Kleisli[RegionT[PS, PP, ?], IORef[List[RefCountedFinalizer]],
              FinalizerHandle[RegionT[PS, PP, ?]]](hsIORef =>
            copy[PS, PP, RegionT[CS, RegionT[PS, PP, ?], ?]](h)))
    }
}

object Dup extends DupInstances {

  /**Duplicates a handle to its parent region. */
  def dup[H[_[_]] : Dup, PP[_] : MonadIO, CS, PS](h: H[RegionT[CS, RegionT[PS, PP, ?], ?]]):
  RegionT[CS, RegionT[PS, PP, ?], H[RegionT[PS, PP, ?]]] = implicitly[Dup[H]].dup.apply(h)

  def copy[S, P[_] : MonadIO, R[_]](h: FinalizerHandle[R]):
  RegionT[S, P, FinalizerHandle[RegionT[S, P, ?]]] = h match {
    case h =>
      RegionT(Kleisli(hsIORef => (for {
        _ <- h.finalizer.refcount.mod(_ + 1)
        _ <- hsIORef.mod(h.finalizer :: _)
      } yield FinalizerHandle[RegionT[S, P, ?]](h.finalizer)).liftIO[P]))
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy