import io:*; typedef NoTraits {}; typedef Trait1 (FirstTrait) {}; typedef Trait2 (SecondTrait) {}; typedef TwoTrait (FirstTrait, SecondTrait) {}; typedef 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 typedef OneTwoObj (FirstTrait) {}; typedef OneTwoObj (SecondTrait) {}; typedef OneTwoObj (FirstTrait, SecondTrait) {}; typedef OneTwoObj {}; /* *typedef 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; OneTwoFunc(a); OneTwoFunc(b); OneTwoFunc(c); OneTwoFunc(d); // OneTwoFunc(e); println(); var alpha: OneTwoObj; var beta: OneTwoObj; var gamma: OneTwoObj; var delta: OneTwoObj; // |OneTwoObj| epsilon; OneTwoFunc>(alpha); OneTwoFunc>(beta); OneTwoFunc>(gamma); OneTwoFunc>(delta); //We can't pass along our inner part, so let's just make sure that it is the right object. //epsilon.proveSpecilized(); return 0; }