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

loci.transmitter.Contexts.scala Maven / Gradle / Ivy

The newest version!
package loci
package transmitter

import Transmittable.Delegating
import Transmittables.{Delegates, Message, None}

sealed trait Contexts[S <: Transmittables] {
  import Contexts._

  val index: Long

  @inline final def message[B, I, R, P, T <: Transmittables](implicit
    ev: Contexts[S] <:< Contexts[Message[Transmittable.Aux[B, I, R, P, T]]])
  : ContextBuilder.Context[T] =
    ev(this) match { case message: SingleMessage[B, I, R, P, T] => message.context }

  @inline final def delegate[B, I, R, P, T <: Transmittables](implicit
    ev: Contexts[S] <:< Contexts[Delegates[Transmittable.Aux[B, I, R, P, T]]])
  : ContextBuilder.Context[T] =
    ev(this) match { case delegating: SingleDelegate[B, I, R, P, T] => delegating.context }

  @inline final def delegatesHead[B, I, R, P, T <: Transmittables, D <: Delegating](implicit
    ev: Contexts[S] <:< Contexts[Delegates[D / Transmittable.Aux[B, I, R, P, T]]])
  : ContextBuilder.Context[T] =
    ev(this) match { case list: List[B, I, R, P, T, D] => list.contextHead }

  @inline final def delegatesTail[B, I, R, P, T <: Transmittables, D <: Delegating](implicit
    ev: Contexts[S] <:< Contexts[Delegates[D / Transmittable.Aux[B, I, R, P, T]]])
  : Contexts[Delegates[D]] =
    ev(this) match { case list: List[B, I, R, P, T, D] => list.contextTail }
}

object Contexts {
  object None extends Contexts[None] { val index = 0L }

  final class SingleMessage[B, I, R, P, T <: Transmittables](
      val context: ContextBuilder.Context[T],
      val index: Long)
    extends Contexts[Message[Transmittable.Aux[B, I, R, P, T]]]

  final class SingleDelegate[B, I, R, P, T <: Transmittables](
      val context: ContextBuilder.Context[T],
      val index: Long)
    extends Contexts[Delegates[Transmittable.Aux[B, I, R, P, T]]]

  final class List[B, I, R, P, T <: Transmittables, D <: Delegating](
      val contextHead: ContextBuilder.Context[T],
      val contextTail: Contexts[Delegates[D]],
      val index: Long)
    extends Contexts[Delegates[D / Transmittable.Aux[B, I, R, P, T]]]
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy