package scalaz

sealed trait LazyTuple2[A,B] {
  def _1: A
  def _2: B
}

sealed trait LazyTuple3[A,B,C] {
  def _1: A
  def _2: B
  def _3: C
}

trait LazyTuple4[A,B,C,D] {
  def _1: A
  def _2: B
  def _3: C
  def _4: D
}

trait LazyTuples {
  type :&:[A,B] = LazyTuple2[A,B]

  def lazyTuple[A,B](a: => A, b: => B) = new (A :&: B) {
    def _1 = a
    def _2 = b
  }

  def lazyTuple[A,B,C](a: => A, b: => B, c: => C) = new LazyTuple3[A,B,C] {
    def _1 = a
    def _2 = b
    def _3 = c
  }

  def lazyTuple[A,B,C,D](a: => A, b: => B, c: => C, d: => D) = new LazyTuple4[A,B,C,D] {
    def _1 = a
    def _2 = b
    def _3 = c
    def _4 = d
  }
}