32 lines
851 B
Plaintext
32 lines
851 B
Plaintext
interface TreeAny guards TreeStamp {}
|
|
def Tree {
|
|
to get(Value) {
|
|
def Tree1 {
|
|
to coerce(specimen, ejector) {
|
|
def tree := TreeAny.coerce(specimen, ejector)
|
|
if (tree.valueType() != Value) {
|
|
throw.eject(ejector, "Tree value type mismatch")
|
|
}
|
|
return tree
|
|
}
|
|
}
|
|
return Tree1
|
|
}
|
|
}
|
|
|
|
def makeTree(T, var value :T, left :nullOk[Tree[T]], right :nullOk[Tree[T]]) {
|
|
def tree implements TreeStamp {
|
|
to valueType() { return T }
|
|
to map(f) {
|
|
value := f(value) # the declaration of value causes this to be checked
|
|
if (left != null) {
|
|
left.map(f)
|
|
}
|
|
if (right != null) {
|
|
right.map(f)
|
|
}
|
|
}
|
|
}
|
|
return tree
|
|
}
|