This is a tiny macro library for Scala that lets your generic code gain access to constructors for your type arguments.
Supported Scala versions: 2.11
, 2.12
, 2.13
.
Artifact |
"net.zygfryd" %% "ctor" % "0.1.1" |
Import |
import zygf.ctor.Ctor |
Obtaining a function that calls the constructor matching the given signature.
You can access the function via the member make
of the returned object.
def foo[T](implicit ctor: Ctor[String => T]) = ctor.make("foo")
A companion object’s apply
method qualifies as a constructor too:
trait Foo
object Foo {
def apply(s: String) = ???
}
val ctor = Ctor.get[String => Foo]
Multiple parameter lists are supported as curried functions:
class Foo(val i: Int)(val s: String)
val ctor = Ctor.get[Int => String => Foo]
ctor.make(42)("foo")
Note
|
Implicit parameter lists need to be converted to regular parameter lists, as there’s no other way to represent them in a function signature. |
class Foo(val i: Int)(implicit val s: String)
Ctor.get[Int => String => Foo] // works
Ctor.get[Int => Foo] // doesn't work
If you omitted the implicit parameter list, the compiler would look for implicit parameters at the constructor function’s creation site and not the call site.
class Foo(val i: Int)(implicit val s: String)
val ctor = {
implicit val s: String = "foo"
Ctor.get[Int => Foo] // works
}
{
implicit val s: String = "bar" // ignored
ctor.make(42) == Foo(42)("foo")
}