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

eventstore.Position.scala Maven / Gradle / Ivy

The newest version!
package eventstore

sealed trait Position extends Ordered[Position]

object Position {
  val First: Exact = Position.Exact(0)

  def apply(position: Long): Position = Position(position, position)

  def apply(commitPosition: Long, preparePosition: Long): Position = {
    if (commitPosition < 0 || preparePosition < 0) Last
    else Exact(commitPosition, preparePosition)
  }

  def apply(direction: ReadDirection): Position = direction match {
    case ReadDirection.Forward  => First
    case ReadDirection.Backward => Last
  }

  case object Last extends Position {
    def compare(that: Position) = if (that.isInstanceOf[Last.type]) 0 else 1

    override def toString = "Position.Last"
  }

  case class Exact(commitPosition: Long, preparePosition: Long) extends Position {
    require(commitPosition >= 0, s"commitPosition must be >= 0, but is $commitPosition")
    require(preparePosition >= 0, s"preparePosition must be >= 0, but is $preparePosition")
    require(commitPosition >= preparePosition, s"commitPosition must be >= preparePosition, but $commitPosition < $preparePosition ")

    def compare(that: Position) = that match {
      case Last => -1
      case Exact(c, p) => (commitPosition compare c, preparePosition compare p) match {
        case (0, 0) => 0
        case (0, x) => x
        case (x, _) => x
      }
    }

    override def toString =
      if (commitPosition == preparePosition) s"Position($commitPosition)"
      else s"Position($commitPosition,$preparePosition)"
  }

  object Exact {
    implicit val ordering = Ordering.by[Exact, Position](identity)
    def apply(position: Long): Exact = Exact(commitPosition = position, preparePosition = position)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy