This repository was archived by the owner on Mar 27, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 11 files changed +134
-44
lines changed
new-control-structure-syntax/src/main/scala/org/lunatech/dotty
opaque-type-aliases/src/main/scala/opaquetypealiases
src/main/scala/org/lunatech/dotty/toplevel Expand file tree Collapse file tree 11 files changed +134
-44
lines changed Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ Global / onChangedBuildSource := ReloadOnSourceChanges
33lazy 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
1820lazy val `new-control-structure-syntax` = project.in(file(" new-control-structure-syntax" ))
1921
@@ -24,6 +26,8 @@ lazy val `enumerations` = project.in(file("enumerations"))
2426lazy val `export-clause` = project.in(file(" export-clause" ))
2527
2628lazy 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
2931lazy val `top-level-definitions` = project.in(file(" top-level-definitions" ))
32+
33+ lazy val `opaque-type-aliases` = project.in(file(" opaque-type-aliases" ))
Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff line change 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 number Diff line number Diff line change 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 number Diff line number Diff line change 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 number Diff line number Diff line change 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 ))
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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 ))
Load Diff This file was deleted.
Load Diff This file was deleted.
You can’t perform that action at this time.
0 commit comments