forked from scala/scala3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patht5541.scala
61 lines (56 loc) · 2.13 KB
/
t5541.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package philips.adolf.paul
trait Sys[ S <: Sys[ S ]] {
type Tx
}
object HASkipList {
sealed trait NodeLike[ S <: Sys[ S ], @specialized( Int ) A ] {
def size : Int
def key( i: Int ): A
}
sealed trait Node[ S <: Sys[ S ], @specialized( Int ) A ] extends NodeLike[ S, A ] {
def isLeaf : Boolean
def isBranch : Boolean
def asBranch : Branch[ S, A ]
}
sealed trait BranchLike[ S <: Sys[ S ], @specialized( Int ) A ] extends NodeLike[ S, A ] {
def down( i: Int )( implicit tx: S#Tx ) : Node[ S, A ] = sys.error("")
}
sealed trait HeadOrBranch[ S <: Sys[ S ], A ]
final class Branch[ S <: Sys[ S ], @specialized( Int ) A ]()
extends BranchLike[ S, A ] with HeadOrBranch[ S, A ] with Node[ S, A ] {
def size:Int=1234
def key(i: Int):A=sys.error("TODO")
def isLeaf : Boolean = false
def isBranch : Boolean = true
def asBranch : Branch[ S, A ] = this
}
}
sealed trait HASkipList[ S <: Sys[ S ], @specialized( Int ) A ]
class HASkipListView[ S <: Sys[ S ], A ]( private val l: HASkipList[ S, A ])( implicit system: S ) {
import HASkipList.Node
private def buildBoxMap( n: Node[ S, A ], isRight: Boolean )( implicit tx: S#Tx ) : (Box, NodeBox) = {
val sz = n.size
val szm = sz - 1
val keys = IndexedSeq.tabulate( sz ) { i =>
val key = n.key( i )
(key, if ( isRight && i == szm ) "M" else key.toString)
}
val chbo = if ( n.isLeaf ) None else {
val nb = n.asBranch
Some( IndexedSeq.tabulate( sz )( i => buildBoxMap( nb.down( i ), isRight && (i == szm) )))
}
val b = NodeBox( n, keys, chbo.map( _.map( _._2 )))
val bb = chbo match {
case Some( chbt ) =>
val chb = chbt.map( _._1 )
val h = Horiz( bs = chb )
Vert( bs = IndexedSeq[Box]( b, h ))
case None => b
}
(bb, b)
}
private trait Box
private case class Horiz( spacing: Int = 20, bs: IndexedSeq[ Box ]) extends Box
private final case class Vert( spacing: Int = 20, bs: IndexedSeq[ Box ]) extends Box
private final case class NodeBox( n: Node[ S, A ], keys: IndexedSeq[ (A, String) ], downs: Option[ IndexedSeq[ NodeBox ]]) extends Box
}