diff --git a/README.md b/README.md index 2f67d39..fcb3a2e 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,13 @@ Any version number that starts with `0.` is automatically recognized as Dotty, you don't need to set up anything: ```scala -def scalaVersion = "0.12.0-RC1" +def scalaVersion = "0.13.0-RC1" ``` #### Nightly builds If the latest release of Dotty is missing a bugfix or feature you need, you may wish to use a nightly build. Look at the bottom of -https://repo1.maven.org/maven2/ch/epfl/lamp/dotty_0.13/ to find the version +https://repo1.maven.org/maven2/ch/epfl/lamp/dotty_0.14/ to find the version number for the latest nightly build. ## Getting your project to compile with Dotty diff --git a/build.sc b/build.sc index 5309e21..e5f9c2c 100644 --- a/build.sc +++ b/build.sc @@ -2,6 +2,6 @@ import mill._, scalalib._ object root extends SbtModule { def millSourcePath = ammonite.ops.pwd - def scalaVersion = "0.12.0-RC1" + def scalaVersion = "0.13.0-RC1" def publishVersion = "0.1.0" } diff --git a/src/main/scala/AutoParamTupling.scala b/src/main/scala/AutoParamTupling.scala index 8582dd7..b72bab8 100644 --- a/src/main/scala/AutoParamTupling.scala +++ b/src/main/scala/AutoParamTupling.scala @@ -1,6 +1,6 @@ /** - * Automatic Tupling of Function Params: http://dotty.epfl.ch/docs/reference/auto-parameter-tupling.html + * Automatic Tupling of Function Params: https://dotty.epfl.ch/docs/reference/other-new-features/auto-parameter-tupling.html */ object AutoParamTupling { @@ -8,7 +8,7 @@ object AutoParamTupling { /** * In order to get thread safety, you need to put @volatile before lazy vals. - * http://dotty.epfl.ch/docs/reference/changed/lazy-vals.html + * https://dotty.epfl.ch/docs/reference/changed-features/lazy-vals.html */ @volatile lazy val xs: List[String] = List("d", "o", "t", "t", "y") diff --git a/src/main/scala/ImplicitFunctions.scala b/src/main/scala/ContextQueries.scala similarity index 64% rename from src/main/scala/ImplicitFunctions.scala rename to src/main/scala/ContextQueries.scala index 749b0b4..3048d66 100644 --- a/src/main/scala/ImplicitFunctions.scala +++ b/src/main/scala/ContextQueries.scala @@ -3,30 +3,28 @@ import scala.concurrent.{ExecutionContext, Future} import scala.util.Try /** - * Implicit Function Types: - * - http://dotty.epfl.ch/docs/reference/implicit-function-types.html, + * Context Queries: + * - http://dotty.epfl.ch/docs/reference/contextual/query-types.html, * - https://www.scala-lang.org/blog/2016/12/07/implicit-function-types.html */ -object ImplicitFunctions { +object ContextQueries /* Formerly known as Implicit Function Types */ { object context { // type alias Contextual - type Contextual[T] = implicit ExecutionContext => T + type Contextual[T] = given ExecutionContext => T // sum is expanded to sum(x, y)(ctx) def asyncSum(x: Int, y: Int): Contextual[Future[Int]] = Future(x + y) - def asyncMult(x: Int, y: Int) = { implicit ctx: ExecutionContext => - Future(x * y) - } + def asyncMult(x: Int, y: Int) given (ctx: ExecutionContext) = Future(x * y) } object parse { - type Parseable[T] = implicit ImplicitParams.StringParser[T] => Try[T] + type Parseable[T] = given ImpliedInstances.StringParser[T] => Try[T] def sumStrings(x: String, y: String): Parseable[Int] = { - val parser = implicitly[ImplicitParams.StringParser[Int]] + val parser = implicitly[ImpliedInstances.StringParser[Int]] val tryA = parser.parse(x) val tryB = parser.parse(y) diff --git a/src/main/scala/ImplicitConversion.scala b/src/main/scala/Conversion.scala similarity index 56% rename from src/main/scala/ImplicitConversion.scala rename to src/main/scala/Conversion.scala index 25bbd12..95b64df 100644 --- a/src/main/scala/ImplicitConversion.scala +++ b/src/main/scala/Conversion.scala @@ -1,20 +1,20 @@ import scala.language.implicitConversions /** - * Implicit Conversions: http://dotty.epfl.ch/docs/reference/changed/implicit-conversions.html + * Conversions: http://dotty.epfl.ch/docs/reference/contextual/conversions.html */ -object ImplicitConversion { +object Conversion { case class IntWrapper(a: Int) extends AnyVal case class DoubleWrapper(b: Double) extends AnyVal - def convert[T, U](x: T)(implicit converter: ImplicitConverter[T, U]): U = converter(x) + def convert[T, U](x: T) given (converter: Conversion[T, U]): U = converter(x) - implicit val IntWrapperToDoubleWrapper: ImplicitConverter[IntWrapper, DoubleWrapper] = new ImplicitConverter[IntWrapper, DoubleWrapper] { + implied IntWrapperToDoubleWrapper for Conversion[IntWrapper, DoubleWrapper] = new Conversion[IntWrapper, DoubleWrapper] { override def apply(i: IntWrapper): DoubleWrapper = new DoubleWrapper(i.a.toDouble) } - def useConversion(implicit f: ImplicitConverter[IntWrapper, DoubleWrapper]) = { + def useConversion given (f: Conversion[IntWrapper, DoubleWrapper]) = { val y: IntWrapper = new IntWrapper(4) val x: DoubleWrapper = y x diff --git a/src/main/scala/EnumTypes.scala b/src/main/scala/EnumTypes.scala index d1c36b5..9621d59 100644 --- a/src/main/scala/EnumTypes.scala +++ b/src/main/scala/EnumTypes.scala @@ -1,5 +1,5 @@ /** - * Enum Types: http://dotty.epfl.ch/docs/reference/adts.html + * Enum Types: http://dotty.epfl.ch/docs/reference/enums/adts.html */ object EnumTypes { diff --git a/src/main/scala/ImplicitParams.scala b/src/main/scala/ImpliedInstances.scala similarity index 59% rename from src/main/scala/ImplicitParams.scala rename to src/main/scala/ImpliedInstances.scala index 59329a3..7b143f8 100644 --- a/src/main/scala/ImplicitParams.scala +++ b/src/main/scala/ImpliedInstances.scala @@ -1,10 +1,10 @@ import scala.util.{Success, Try} /** - * Implicit By-Name Parameters: - * - http://dotty.epfl.ch/docs/reference/implicit-by-name-parameters.html + * Implied Instances: + * - https://dotty.epfl.ch/docs/reference/contextual/instance-defs.html */ -object ImplicitParams { +object ImpliedInstances { sealed trait StringParser[A] { def parse(s: String): Try[A] @@ -12,16 +12,16 @@ object ImplicitParams { object StringParser { - def apply[A](implicit parser: StringParser[A]): StringParser[A] = parser + def apply[A] given (parser: StringParser[A]): StringParser[A] = parser private def baseParser[A](f: String ⇒ Try[A]): StringParser[A] = new StringParser[A] { override def parse(s: String): Try[A] = f(s) } - implicit val stringParser: StringParser[String] = baseParser(Success(_)) - implicit val intParser: StringParser[Int] = baseParser(s ⇒ Try(s.toInt)) + implied stringParser for StringParser[String] = baseParser(Success(_)) + implied intParser for StringParser[Int] = baseParser(s ⇒ Try(s.toInt)) - implicit def optionParser[A](implicit parser: => StringParser[A]): StringParser[Option[A]] = new StringParser[Option[A]] { + implied optionParser[A] given (parser: => StringParser[A]) for StringParser[Option[A]] = new StringParser[Option[A]] { override def parse(s: String): Try[Option[A]] = s match { case "" ⇒ Success(None) // implicit parser not used. case str ⇒ parser.parse(str).map(x ⇒ Some(x)) // implicit parser is evaluated at here @@ -34,6 +34,6 @@ object ImplicitParams { println(implicitly[StringParser[Option[Int]]].parse("")) println(implicitly[StringParser[Option[Int]]].parse("21a")) - println(implicitly[StringParser[Option[Int]]](StringParser.optionParser[Int](StringParser.intParser)).parse("42")) + println(implicitly[StringParser[Option[Int]]](StringParser.optionParser[Int]).parse("42")) } } diff --git a/src/main/scala/IntersectionTypes.scala b/src/main/scala/IntersectionTypes.scala index 2a91725..9ebeed4 100644 --- a/src/main/scala/IntersectionTypes.scala +++ b/src/main/scala/IntersectionTypes.scala @@ -1,5 +1,5 @@ /** - * Intersection Types: http://dotty.epfl.ch/docs/reference/intersection-types.html + * Intersection Types: https://dotty.epfl.ch/docs/reference/new-types/intersection-types.html */ object IntersectionTypes { diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala index df2d788..18aed26 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/Main.scala @@ -7,11 +7,11 @@ object Main { runExample("Enum Types")(EnumTypes.test) - runExample("Implicit Functions")(ImplicitFunctions.test) + runExample("Context Queries")(ContextQueries.test) - runExample("Implicit Params")(ImplicitParams.test) + runExample("Implied Instances")(ImpliedInstances.test) - runExample("Implicit Conversion")(ImplicitConversion.test) + runExample("Conversion")(Conversion.test) runExample("Union Types")(UnionTypes.test) diff --git a/src/main/scala/MultiversalEquality.scala b/src/main/scala/MultiversalEquality.scala index 6e837c3..d9f87b6 100644 --- a/src/main/scala/MultiversalEquality.scala +++ b/src/main/scala/MultiversalEquality.scala @@ -1,24 +1,24 @@ import scala.language.strictEquality /** - * Multiversal Equality: http://dotty.epfl.ch/docs/reference/multiversal-equality.html - * scala.Eq definition: https://github.com/lampepfl/dotty/blob/master/library/src/scala/Eq.scala + * Multiversal Equality: https://dotty.epfl.ch/docs/reference/contextual/multiversal-equality.html + * scala.Eq definition: https://github.com/lampepfl/dotty/blob/master/library/src/scala/Eql.scala */ object MultiversalEquality { def test: Unit = { // Values of types Int and String cannot be compared with == or !=, - // unless we add a custom implicit like: - implicit def eqIntString: Eq[Int, String] = Eq + // unless we add the derived implied instance like: + implied for Eql[Int, String] = Eql.derived println(3 == "3") // By default, all numbers are comparable, because of; - // implicit def eqNumber : Eq[Number, Number] = Eq + // implicit def eqlNumber: Eql[Number, Number] = derived println(3 == 5.1) // By default, all Sequences are comparable, because of; - // implicit def eqSeq[T, U](implicit eq: Eq[T, U]): Eq[Seq[T], Seq[U]] = Eq + // implicit def eqlSeq[T, U](implicit eq: Eql[T, U]): Eql[GenSeq[T], GenSeq[U]] = derived println(List(1, 2) == Vector(1, 2)) class A(a: Int) @@ -27,10 +27,10 @@ object MultiversalEquality { val a = new A(4) val b = new B(4) - // scala.language.strictEquality is enabled, therefore we need some extra implicits + // scala.language.strictEquality is enabled, therefore we need some extra implied instances // to compare instances of A and B. - implicit def eqAB: Eq[A, B] = Eq - implicit def eqBA: Eq[B, A] = Eq + implied for Eql[A, B] = Eql.derived + implied for Eql[B, A] = Eql.derived println(a != b) println(b == a) diff --git a/src/main/scala/NamedTypeArguments.scala b/src/main/scala/NamedTypeArguments.scala index fa4c438..85cee9a 100644 --- a/src/main/scala/NamedTypeArguments.scala +++ b/src/main/scala/NamedTypeArguments.scala @@ -1,6 +1,6 @@ /** - * Named Type Arguments: http://dotty.epfl.ch/docs/reference/named-typeargs.html + * Named Type Arguments: https://dotty.epfl.ch/docs/reference/other-new-features/named-typeargs.html */ object NamedTypeArguments { diff --git a/src/main/scala/PatternMatching.scala b/src/main/scala/PatternMatching.scala index 14d9d37..8e64e87 100644 --- a/src/main/scala/PatternMatching.scala +++ b/src/main/scala/PatternMatching.scala @@ -1,6 +1,6 @@ /** - * Pattern Matching: http://dotty.epfl.ch/docs/reference/changed/pattern-matching.html + * Pattern Matching: https://dotty.epfl.ch/docs/reference/changed-features/pattern-matching.html */ object PatternMatching { diff --git a/src/main/scala/StructuralTypes.scala b/src/main/scala/StructuralTypes.scala index 3c7499d..4eb60a4 100644 --- a/src/main/scala/StructuralTypes.scala +++ b/src/main/scala/StructuralTypes.scala @@ -1,6 +1,6 @@ /** - * Structural Types: http://dotty.epfl.ch/docs/reference/changed/structural-types.html + * Structural Types: https://dotty.epfl.ch/docs/reference/changed-features/structural-types.html */ object StructuralTypes { diff --git a/src/main/scala/TraitParams.scala b/src/main/scala/TraitParams.scala index 0af162b..5d44099 100644 --- a/src/main/scala/TraitParams.scala +++ b/src/main/scala/TraitParams.scala @@ -1,5 +1,5 @@ /** - * Trait Parameters: http://dotty.epfl.ch/docs/reference/trait-parameters.html + * Trait Parameters: https://dotty.epfl.ch/docs/reference/other-new-features/trait-parameters.html */ object TraitParams { diff --git a/src/main/scala/TypeLambdas.scala b/src/main/scala/TypeLambdas.scala index bc1c370..c877c71 100644 --- a/src/main/scala/TypeLambdas.scala +++ b/src/main/scala/TypeLambdas.scala @@ -1,5 +1,5 @@ /** - * Type Lambdas: http://dotty.epfl.ch/docs/reference/type-lambdas.html + * Type Lambdas: https://dotty.epfl.ch/docs/reference/new-types/type-lambdas.html */ object TypeLambdas { diff --git a/src/main/scala/UnionTypes.scala b/src/main/scala/UnionTypes.scala index 8d992bf..ab3e365 100644 --- a/src/main/scala/UnionTypes.scala +++ b/src/main/scala/UnionTypes.scala @@ -1,5 +1,5 @@ /** - * Union Types: http://dotty.epfl.ch/docs/reference/union-types.html + * Union Types: https://dotty.epfl.ch/docs/reference/new-types/union-types.html */ object UnionTypes {