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

com.gu.mockless.Empty.scala Maven / Gradle / Ivy

package com.gu.mockless

import shapeless._

trait Empty[A] {
  def empty: A
}

object Empty extends ProductTypeClassCompanion[Empty] {
  def empty[A](implicit M: Empty[A]) = M.empty

  implicit val emptyInt = new Empty[Int] {
    override def empty: Int = 0
  }

  implicit val emptyString = new Empty[String] {
    override def empty: String = ""
  }

  implicit def emptyOption[A] = new Empty[Option[A]] {
    override def empty: Option[A] = None
  }

  implicit def emptyList[A] = new Empty[List[A]] {
    override def empty: List[A] = Nil
  }

  implicit def emptySeq[A] = new Empty[Seq[A]] {
    override def empty: Seq[A] = Nil
  }

  implicit def emptyMap[A, B] = new Empty[Map[A, B]] {
    override def empty: Map[A, B] = Map.empty
  }

  implicit def emptyEither[A, B](implicit M: Empty[B]) = new Empty[Either[A, B]] {
    override def empty: Either[A, B] = Right(M.empty)
  }

  implicit val emptyInstance: ProductTypeClass[Empty] = new ProductTypeClass[Empty] {
    override def emptyProduct: Empty[HNil] = new Empty[HNil] {
      override def empty: HNil = HNil
    }

    override def product[H, T <: HList](CHead: Empty[H], CTail: Empty[T]): Empty[H :: T] = new Empty[H :: T] {
      override def empty: H :: T = CHead.empty :: CTail.empty
    }

    override def project[F, G](instance: => Empty[G], to: (F) => G, from: (G) => F): Empty[F] = new Empty[F] {
      override def empty: F = from(instance.empty)
    }
  }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy