@@ -4,51 +4,47 @@ package progscala3.contexts.typeclass.old
44
55import progscala3 .introscala .shapes .{Point , Shape , Circle , Rectangle , Triangle }
66
7- trait ToJSONOld [T ]:
8- def toJSON (name : String = " " , level : Int = 0 ): String // <1>
7+ // DeanW: September 14, 2025. Scala is dropping support for implicit classes, so the
8+ // `implicit final class PointToJSON`, etc. are now replaced by extension methods
9+ // and the trait ToJSONOld is converted to an object for its methods.
910
10- protected val indent = " "
11- protected def indentation (level : Int ): (String ,String ) =
11+ object ToJSONOld :
12+ val indent = " "
13+ def indentation (level : Int ): (String ,String ) =
1214 (indent * level, indent * (level+ 1 ))
13- protected def handleName (name : String ): String =
15+ def handleName (name : String ): String =
1416 if name.length > 0 then s """ " $name": """ else " "
15- // end::trait[]
17+ end ToJSONOld
1618
17- // tag::pointcircle[]
18- implicit final class PointToJSON (
19- point : Point ) extends ToJSONOld [Point ]:
20- def toJSON (name : String = " " , level : Int = 0 ): String =
21- val (outdent, indent) = indentation(level)
22- s """ ${handleName(name)}{
19+ extension(point : Point )
20+ def toJSON (name : String , level : Int ): String =
21+ val (outdent, indent) = ToJSONOld .indentation(level)
22+ s """ ${ToJSONOld .handleName(name)}{
2323 | ${indent}"x": " ${point.x}",
2424 | ${indent}"y": " ${point.y}"
2525 | $outdent} """ .stripMargin
2626
27- implicit final class CircleToJSON (
28- circle : Circle ) extends ToJSONOld [Circle ]:
29- def toJSON (name : String = " " , level : Int = 0 ): String =
30- val (outdent, indent) = indentation(level)
31- s """ ${handleName(name)}{
27+ extension(circle : Circle )
28+ def toJSON (name : String , level : Int ): String =
29+ val (outdent, indent) = ToJSONOld .indentation(level)
30+ s """ ${ToJSONOld .handleName(name)}{
3231 | ${indent}${circle.center.toJSON(" center" , level + 1 )},
3332 | ${indent}"radius": ${circle.radius}
3433 | $outdent} """ .stripMargin
35- // end::pointcircle[]
3634
37- implicit final class RectangleToJSON (
38- rect : Rectangle ) extends ToJSONOld [Rectangle ]:
39- def toJSON (name : String = " " , level : Int = 0 ): String =
40- val (outdent, indent) = indentation(level)
41- s """ ${handleName(name)}{
35+ extension(rect : Rectangle )
36+ def toJSON (name : String , level : Int ): String =
37+ val (outdent, indent) = ToJSONOld .indentation(level)
38+ s """ ${ToJSONOld .handleName(name)}{
4239 | ${indent}${rect.lowerLeft.toJSON(" lowerLeft" , level + 1 )},
4340 | ${indent}"height": ${rect.height}
4441 | ${indent}"width": ${rect.width}
4542 | $outdent} """ .stripMargin
4643
47- implicit final class TriangleToJSON (
48- tri : Triangle ) extends ToJSONOld [Triangle ]:
49- def toJSON (name : String = " " , level : Int = 0 ): String =
50- val (outdent, indent) = indentation(level)
51- s """ ${handleName(name)}{
44+ extension(tri : Triangle )
45+ def toJSON (name : String , level : Int ): String =
46+ val (outdent, indent) = ToJSONOld .indentation(level)
47+ s """ ${ToJSONOld .handleName(name)}{
5248 | ${indent}${tri.point1.toJSON(" point1" , level + 1 )},
5349 | ${indent}${tri.point2.toJSON(" point2" , level + 1 )},
5450 | ${indent}${tri.point3.toJSON(" point3" , level + 1 )},
0 commit comments