Skip to content

Commit

Permalink
zio#794: Derivation tools for external newtypes
Browse files Browse the repository at this point in the history
  • Loading branch information
soujiro32167 committed Feb 16, 2022
1 parent 3a27000 commit 756721a
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package zio.prelude.newtypes

import zio.prelude.{Newtype, Subtype}
import zio.test._
import zio.prelude.newtypes.derivation.derive

object DerivationSpec extends DefaultRunnableSpec {
trait Show[A]{
def show(a: A): String
}

implicit val showString: Show[String] = (a: String) => a

// these are imported from an external library - we have no control over them
object External{
object Secret extends Newtype[String]
type Secret = Secret.Type

object Password extends Subtype[String]
type Password = Password.Type
}

import External._

override def spec = suite("external derivation for newtypes")(
test("works for Newtype"){
val showSecret: Show[Secret] = derive
assertTrue(showSecret.show(Secret("foo")) == "foo")
},
test("works for Subtype"){
val showPassword: Show[Password] = derive
assertTrue(showPassword.show(Password("foo")) == "foo")
},
testM("works with auto derivation"){
typeCheck(
"""
|import zio.prelude.newtypes.derivation.auto._
|implicitly[Show[Secret]]
|implicitly[Show[Password]]
|""".stripMargin)
.absolve
.as(assertCompletes)
}
)
}
14 changes: 14 additions & 0 deletions core/shared/src/main/scala/zio/prelude/newtypes/derivation.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package zio.prelude.newtypes

import zio.prelude.Newtype

object derivation {
def derive[A, STA <: Newtype[A], F[_]](implicit ev: STA <:< Newtype[A], typeClass: F[A]): F[STA#Type] =
typeClass.asInstanceOf[F[STA#Type]]

trait Auto {
implicit def auto[A, STA <: Newtype[A], F[_]](implicit ev: STA <:< Newtype[A], typeClass: F[A]): F[STA#Type] =
derive
}
object auto extends Auto
}

0 comments on commit 756721a

Please sign in to comment.