Skip to content
This repository was archived by the owner on Mar 27, 2025. It is now read-only.

Commit 258dc3b

Browse files
authored
Add more snippets/Remove unused code in root folder (#120)
1 parent d79c35b commit 258dc3b

File tree

11 files changed

+134
-44
lines changed

11 files changed

+134
-44
lines changed

code-snippets/build.sbt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Global / onChangedBuildSource := ReloadOnSourceChanges
33
lazy val `scala-3-snippets` = project
44
.in(file("."))
55
.settings(ThisBuild / scalaVersion := "3.3.0")
6+
.settings(ThisBuild / scalacOptions ++= Seq("-source", "3.3-migration"))
67
.settings(
78
name := "dotty-simple",
89
version := "0.1.0",
@@ -13,7 +14,8 @@ lazy val `scala-3-snippets` = project
1314
`intersection-and-union-types`,
1415
`enumerations`,
1516
`export-clause`,
16-
`top-level-definitions`)
17+
`top-level-definitions`,
18+
`opaque-type-aliases`)
1719

1820
lazy val `new-control-structure-syntax` = project.in(file("new-control-structure-syntax"))
1921

@@ -24,6 +26,8 @@ lazy val `enumerations` = project.in(file("enumerations"))
2426
lazy val `export-clause` = project.in(file("export-clause"))
2527

2628
lazy val `intersection-and-union-types` =
27-
project.in(file("intersection-and-union-types")).settings(scalacOptions ++= Seq("-source", "future-migration"))
29+
project.in(file("intersection-and-union-types"))
2830

2931
lazy val `top-level-definitions` = project.in(file("top-level-definitions"))
32+
33+
lazy val `opaque-type-aliases` = project.in(file("opaque-type-aliases"))

code-snippets/new-control-structure-syntax/src/main/scala/org/lunatech/dotty/NewControlStructures.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ object NewControlStructures {
66
val xs = Seq(1, 2, 3)
77
val ys = Seq(3, 4, 5)
88

9-
def body: Int = 6
10-
119
if x < 0 then "negative"
1210
else if x == 0 then "zero"
1311
else "positive"
@@ -26,6 +24,12 @@ object NewControlStructures {
2624
y <- ys
2725
do println(x + y)
2826

29-
// try body
30-
// catch case ex: IOException => handle
27+
def body: Int =
28+
throw new IllegalArgumentException("Bad argument")
29+
5
30+
31+
def handle = ???
32+
val result =
33+
try body
34+
catch case ex: IllegalArgumentException => handle
3135
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package opaquetypelaliases.caseclasses
2+
3+
case class Kilometres(value: Double)
4+
5+
class Rocket(distanceTravelled: Kilometres):
6+
def advance(distanceToAdvance: Kilometres): Rocket = new Rocket(
7+
Kilometres(distanceTravelled.value + distanceToAdvance.value))
8+
9+
val rocket = Rocket(Kilometres(1000))
10+
11+
val r1 = rocket.advance(Kilometres(5000))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package opaquetypelaliases.opaquetypealias
2+
3+
object OpaqueTypeAliasesDefinitions:
4+
5+
opaque type Kilometres = Double
6+
object Kilometres:
7+
def apply(d: Double): Kilometres = d
8+
9+
opaque type Miles = Double
10+
object Miles:
11+
def apply(d: Double): Miles = d
12+
13+
extension (a: Kilometres)
14+
@scala.annotation.targetName("plusKm")
15+
def +(b: Kilometres): Kilometres = a + b
16+
def toMiles: Miles = a / 1.6
17+
18+
extension (a: Miles)
19+
@scala.annotation.targetName("plusMiles")
20+
def +(b: Miles): Miles = a + b
21+
def toKm: Kilometres = a * 1.6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package opaquetypelaliases.opaquetypealias
2+
3+
object UsingTheAliases {
4+
import OpaqueTypeAliasesDefinitions.*
5+
6+
class Rocket(distanceTravelled: Kilometres):
7+
def advance(distanceToAdvance: Kilometres): Rocket = new Rocket(distanceTravelled + distanceToAdvance)
8+
9+
type Conversion[A] = A => Kilometres
10+
class Booster():
11+
def advanceRocket[A: Conversion](rocket: Rocket, distanceToAdvance: A): Rocket = {
12+
val distanceInKm = summon[Conversion[A]](distanceToAdvance)
13+
rocket.advance(distanceInKm)
14+
}
15+
16+
val rocket1 = new Rocket(Kilometres(0))
17+
val rocket2 = new Rocket(Kilometres(0))
18+
val booster = new Booster()
19+
20+
given Conversion[Kilometres] = identity
21+
given Conversion[Miles] = _.toKm
22+
23+
val r1 = booster.advanceRocket(rocket1, Kilometres(100)) // No allocation of Kilometres object
24+
val r2 = booster.advanceRocket(rocket2, Miles(200)) // No allocation of Miles object
25+
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package opaquetypelaliases.parametricpolymorphism
2+
3+
case class Kilometres(value: Double) extends AnyVal
4+
case class Miles(value: Double) extends AnyVal
5+
6+
class Rocket(distanceTravelled: Kilometres):
7+
def advance(distanceToAdvance: Kilometres): Rocket = new Rocket(
8+
Kilometres(distanceTravelled.value + distanceToAdvance.value))
9+
10+
type Conversion[A] = A => Kilometres
11+
class Booster():
12+
def advanceRocket[A: Conversion](rocket: Rocket, distanceToAdvance: A): Rocket = {
13+
val distanceInKm = summon[Conversion[A]](distanceToAdvance)
14+
rocket.advance(distanceInKm)
15+
}
16+
17+
val rocket1 = new Rocket(Kilometres(0))
18+
val rocket2 = new Rocket(Kilometres(0))
19+
val booster = new Booster()
20+
21+
given Conversion[Kilometres] = identity
22+
given Conversion[Miles] = miles => Kilometres(miles.value * 1.6)
23+
24+
val r1 = booster.advanceRocket(rocket1, Kilometres(100)) // Allocation of Kilometres object
25+
val r2 = booster.advanceRocket(rocket2, Miles(200))
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package opaquetypelaliases.subtyping
2+
3+
sealed trait Distance extends Any
4+
case class Kilometres(value: Double) extends AnyVal with Distance
5+
case class Miles(value: Double) extends AnyVal with Distance
6+
7+
class Rocket(distanceTravelled: Kilometres):
8+
def advance(distanceToAdvance: Kilometres): Rocket = new Rocket(
9+
Kilometres(distanceTravelled.value + distanceToAdvance.value))
10+
11+
class Booster():
12+
def advanceRocket(rocket: Rocket, distanceToAdvance: Distance): Rocket = {
13+
val distanceInKm = distanceToAdvance match {
14+
case miles: Miles => Kilometres(miles.value * 1.6)
15+
case km: Kilometres => km
16+
}
17+
rocket.advance(distanceInKm)
18+
}
19+
20+
val rocket1 = new Rocket(Kilometres(0))
21+
val rocket2 = new Rocket(Kilometres(0))
22+
val booster = new Booster()
23+
24+
val r1 = booster.advanceRocket(rocket1, Kilometres(100)) // Allocation of Kilometres object
25+
val r2 = booster.advanceRocket(rocket2, Miles(200)) // Allocation of Miles object
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package opaquetypelaliases.valueclasses
2+
3+
case class Kilometres(value: Double) extends AnyVal
4+
5+
class Rocket(distanceTravelled: Kilometres):
6+
def advance(distanceToAdvance: Kilometres): Rocket = new Rocket(
7+
Kilometres(distanceTravelled.value + distanceToAdvance.value))
8+
9+
val rocket1 = new Rocket(Kilometres(0))
10+
11+
val rocket2 = rocket1.advance(Kilometres(12000))

code-snippets/src/main/scala/org/lunatech/dotty/toplevel/TemperatureConverter.scala

Lines changed: 0 additions & 11 deletions
This file was deleted.

code-snippets/src/main/scala/org/lunatech/dotty/toplevel/TemperatureOps.scala

Lines changed: 0 additions & 26 deletions
This file was deleted.

slides/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes">
66

7-
<title>Moving from Scala to Java</title>
7+
<title>Moving from Scala 2 to Scala 3</title>
88

99
<link rel="stylesheet" href="dist/reset.css">
1010
<link rel="stylesheet" href="dist/reveal.css">

0 commit comments

Comments
 (0)