@@ -12,11 +12,10 @@ object Logarithms {
1212 }
1313
1414 // Extension methods define opaque types' public APIs
15- extension (x : Logarithm ) {
15+ extension (x : Logarithm )
1616 def toDouble : Double = math.exp(x)
1717 def + (y : Logarithm ): Logarithm = Logarithm (math.exp(x) + math.exp(y))
18- def * (y : Logarithm ): Logarithm = Logarithm (x + y)
19- }
18+ def * (y : Logarithm ): Logarithm = x + y
2019}
2120
2221object LogTest {
@@ -36,31 +35,42 @@ object Access {
3635 opaque type PermissionChoice = Int
3736 opaque type Permission <: Permissions & PermissionChoice = Int
3837
39- extension (x : Permissions ) def & (y : Permissions ): Permissions = x & y
40- extension (x : PermissionChoice ) def | (y : PermissionChoice ): PermissionChoice = x | y
41- extension (x : Permissions ) def is (y : Permissions ) = (x & y) == y
42- extension (x : Permissions ) def isOneOf (y : PermissionChoice ) = (x & y) != 0
38+ extension (x : Permissions )
39+ def & (y : Permissions ): Permissions = x | y
40+ extension (x : PermissionChoice )
41+ def | (y : PermissionChoice ): PermissionChoice = x | y
42+ extension (granted : Permissions )
43+ def is (required : Permissions ) = (granted & required) == required
44+ extension (granted : Permissions )
45+ def isOneOf (required : PermissionChoice ) = (granted & required) != 0
4346
4447 val NoPermission : Permission = 0
45- val ReadOnly : Permission = 1
46- val WriteOnly : Permission = 2
47- val ReadWrite : Permissions = ReadOnly & WriteOnly
48- val ReadOrWrite : PermissionChoice = ReadOnly | WriteOnly
48+ val Read : Permission = 1
49+ val Write : Permission = 2
50+ val ReadWrite : Permissions = Read | Write
51+ val ReadOrWrite : PermissionChoice = Read | Write
4952}
5053
5154object User {
5255 import Access ._
5356
5457 case class Item (rights : Permissions )
5558
56- val x = Item (ReadOnly ) // OK, since Permission <: Permissions
59+ val roItem = Item (Read ) // OK, since Permission <: Permissions
60+ val rwItem = Item (ReadWrite )
61+ val noItem = Item (NoPermission )
5762
58- assert( x .rights.is(ReadWrite ) == false )
59- assert( x .rights.isOneOf(ReadOrWrite ) == true )
63+ assert( roItem .rights.is(ReadWrite ) == false )
64+ assert( roItem .rights.isOneOf(ReadOrWrite ) == true )
6065
61- // Would be a type error:
62- // assert( x .rights.isOneOf(ReadWrite ) == true )
66+ assert( rwItem.rights.is( ReadWrite ) == true )
67+ assert( rwItem .rights.isOneOf(ReadOrWrite ) == true )
6368
69+ assert( noItem.rights.is(ReadWrite ) == false )
70+ assert( noItem.rights.isOneOf(ReadOrWrite ) == false )
71+
72+ // Would be a type error:
73+ // assert( roItem.rights.isOneOf(ReadWrite) == true )
6474}
6575
6676object o {
0 commit comments