import io:*; obj NoTraits {}; obj Trait1 (FirstTrait) {}; obj Trait2 (SecondTrait) {}; obj TwoTrait (FirstTrait, SecondTrait) {}; obj AlreadySpecilized (FirstTrait, SecondTrait) {}; fun OneTwoFunc(obj: T): void { println("No Traits"); } fun OneTwoFunc(obj: T): void { println("First Trait"); } fun OneTwoFunc(obj: T): void { println("Second Trait"); } fun OneTwoFunc(obj: T): void { println("Both Traits"); } /* template |void| OneTwoFunc(|AlreadySpecilized| obj) { println("Already Specilized"); } */ //This should work for objects too! //To test, we cycle the mapping of traits obj OneTwoObj (FirstTrait) {}; obj OneTwoObj (SecondTrait) {}; obj OneTwoObj (FirstTrait, SecondTrait) {}; obj OneTwoObj {}; /* *obj template OneTwoObj { * void proveSpecilized() { * println("I'm specilized!"); * } *}; */ fun main(): int { var a: NoTraits; var b: Trait1; var c: Trait2; var d: TwoTrait; var e: AlreadySpecilized; var f: TwoTrait*; OneTwoFunc(a); OneTwoFunc(b); OneTwoFunc(c); OneTwoFunc(d); // OneTwoFunc(e); OneTwoFunc(f); println(); OneTwoFunc(a); OneTwoFunc(b); OneTwoFunc(c); OneTwoFunc(d); // OneTwoFunc(e); OneTwoFunc(f); println(); var alpha: OneTwoObj; var beta: OneTwoObj; var gamma: OneTwoObj; var delta: OneTwoObj; // |OneTwoObj| epsilon; var zeta: OneTwoObj; OneTwoFunc>(alpha); OneTwoFunc>(beta); OneTwoFunc>(gamma); OneTwoFunc>(delta); OneTwoFunc>(zeta); println() OneTwoFunc(alpha); OneTwoFunc(beta); OneTwoFunc(gamma); OneTwoFunc(delta); OneTwoFunc(zeta); //We can't pass along our inner part, so let's just make sure that it is the right object. //epsilon.proveSpecilized(); return 0; }