File tree Expand file tree Collapse file tree 1 file changed +67
-0
lines changed
Expand file tree Collapse file tree 1 file changed +67
-0
lines changed Original file line number Diff line number Diff line change 1+ package scala
2+
3+
4+ object ConversionFunction {
5+
6+ opaque type ConversionFunction [+ F <: Nothing => Any ] = F
7+
8+ def apply [F <: Nothing => Any ](f : F ): ConversionFunction [F ] = f
9+ def get [F <: Nothing => Any ](using f : ConversionFunction [F ]): F = f
10+
11+ }
12+
13+ given [F <: Nothing => Any ] as Conversion /* Function*/ [F , ConversionFunction [F ]] = (x : F ) => ConversionFunction .apply(x)
14+
15+ type ConversionFunction [+ F <: Nothing => Any ] =
16+ ConversionFunction .ConversionFunction [F ]
17+
18+ type Conversion2 [T , U ] =
19+ ConversionFunction .ConversionFunction [T => U ]
20+
21+ object Test {
22+
23+ {
24+ given Conversion2 [Int , String ] = (x : Int ) => x.toString
25+ // val a: String = 3
26+ val a : String = ConversionFunction .get[3 => String ].apply(3 )
27+ }
28+
29+ {
30+ given ConversionFunction [Int => String ] = (x : Int ) => x.toString
31+ // val a: String = 3
32+ val a : String = ConversionFunction .get[3 => String ].apply(3 )
33+ }
34+
35+ {
36+ given ConversionFunction [(x : Int ) => x.type ] = ConversionFunction ((x : Int ) => x)
37+ // val a: String = 3
38+ val a : Int = ConversionFunction .get[3 => Int ].apply(3 )
39+ }
40+
41+
42+ {
43+ trait X {
44+ type T
45+ def t : T
46+ }
47+ val x : X = ???
48+
49+ given ConversionFunction [(x : X ) => x.T ] = (x : X ) => x.t
50+ // val a: String = 3
51+ val a : x.T = ConversionFunction .get[(x : X ) => x.T ].apply(x)
52+ }
53+
54+
55+ {
56+ trait X {
57+ type T
58+ def t : T
59+ }
60+ val x : X = ???
61+
62+ given ConversionFunction [(x : X ) => x.T ] = ConversionFunction (_.t)
63+ // val a: String = 3
64+ val a : x.T = ConversionFunction .get[(x : X ) => x.T ].apply(x)
65+ }
66+
67+ }
You can’t perform that action at this time.
0 commit comments