type Pair { left: A, right: B, } type Box { value: T, fn rightOf(self: ref, pair: ref>) -> U { return pair.right } } type PlainBox { value: i32, fn project(self: ref, pair: ref>) -> U { return pair.right } } interface Projector { fn project(self: ref, pair: ref>) -> U } fn project, U: Type>(value: ref, pair: ref>) -> U { return T.project(value, pair) } pub fn main() -> Void { let box: Box = Box { value: 1 } let pair: Pair = Pair { left: 2, right: true } let receiver: Bool = box.rightOf(&pair) let namespaced: Bool = Box.rightOf(&box, &pair) let plain: PlainBox = PlainBox { value: 3 } let projectedPair: Pair = Pair { left: PlainBox { value: 4 }, right: true } let projected: Bool = project(&plain, &projectedPair) expect (receiver && namespaced && projected) }