1
1
import scala .util .Try
2
+ import scala .reflect .TypeTest
3
+
2
4
3
5
trait RDF :
4
6
rdf =>
5
7
6
8
type R = rdf.type
7
9
type Node <: Matchable
8
10
type URI <: Node
11
+ type BNode <: Node
9
12
10
13
given rops : ROps [R ]
11
14
end RDF
@@ -17,24 +20,31 @@ object RDF:
17
20
type URI [R <: RDF ] <: Node [R ] = R match
18
21
case GetURI [u] => u & Node [R ]
19
22
23
+ type BNode [R <: RDF ] <: Node [R ] = R match
24
+ case GetBNode [b] => b & Node [R ]
25
+
26
+ type Subject [R <: RDF ] = URI [R ] | BNode [R ]
27
+
20
28
private type GetNode [N ] = RDF { type Node = N }
21
29
private type GetURI [U ] = RDF { type URI = U }
30
+ private type GetBNode [B ] = RDF { type BNode = B }
22
31
end RDF
23
32
24
33
trait ROps [R <: RDF ]:
25
34
def mkUri (str : String ): Try [RDF .URI [R ]]
26
35
def auth (uri : RDF .URI [R ]): Try [String ]
36
+ given subjToURITT : TypeTest [RDF .Subject [R ], RDF .URI [R ]]
27
37
28
38
object TraitTypes :
29
39
trait Node :
30
40
def value : String
31
41
32
42
trait Uri extends Node
33
-
43
+ trait BNode extends Node
44
+
34
45
def mkUri (u : String ): Uri =
35
46
new Uri { def value = u }
36
47
37
-
38
48
object TraitRDF extends RDF :
39
49
import TraitTypes as tz
40
50
@@ -46,6 +56,12 @@ object TraitRDF extends RDF:
46
56
override def auth (uri : RDF .URI [R ]): Try [String ] =
47
57
Try (java.net.URI .create(uri.value).getAuthority())
48
58
59
+ given subjToURITT : TypeTest [RDF .Subject [R ], RDF .URI [R ]] with
60
+ override def unapply (s : RDF .Subject [R ]): Option [s.type & URI ] =
61
+ s match
62
+ case x : (s.type & RDF .URI [R ]) => Some (x)
63
+ case _ => None
64
+
49
65
end TraitRDF
50
66
51
67
class Test [R <: RDF ](using rops : ROps [R ]):
0 commit comments