On Wed, 12 Aug 2020, Stuart Hungerford wrote: > Hi, > > I'm working with roles where the mixing-in classes and roles need to > have some mixin-specific notion of equality. So I have an Equality > role that can also be > mixed in as needed: > > role Equality { > method equal(Equality:D) of Bool:D {...} > } > > To make using the role easier I've created an infix operator "=/=". To > give the infix operator predcitable semantics I need to specify the > precedence and the associativity with traits: > > sub infix:<=/=>(Equality:D \x, Equality:D \y) of Bool:D is > equiv(&infix:<==>) is assoc<chain> is export { > x.equal(y) > } > > Is there some way to combine traits to a more succinct trait? Something like: > > subset Equivalence of Routine where {magic}...; > > sub infix:<=/=>(Equality:D \x, Equality:D \y) of Bool:D is equivalence > is export; > > Would a custom version of the trait_mod:<is> routine do the trick?
Yes: multi trait_mod:<is> (Routine $r, :$equivalence!) { trait_mod:<is>($r, :equiv(&infix:<==>)); trait_mod:<is>($r, :assoc<chain>); } At the same time you can mix in a role if you need to, by adding `$r does Equivalence`. If you want to query this information of a predefined operator to make a subset, check for instance dd &infix:<+>.prec # Hash element = {:assoc("left"), :prec("t=")} at least on Rakudo. I have no idea if this attribute or the format for the 'prec' key in particular are standardized. Best, Tobias