On Wed, Aug 12, 2020 at 8:12 AM Tobias Boege <t...@taboege.de> wrote:

> > 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=")}

Nice!

Thanks for that insight.

Stu

Reply via email to