> Would a better approach be to create custom subtypes
of the built-in numeric types that mixin the algebraic roles?
It could maybe work out better to mix roles into numeric instances:
role G {
has Numeric $numeric handles *;
has ThreeDObject[:Rotation] $threedobject-rotation handles *;
method G { "Gotta like groups" }
}
given 42 does G { say .G, .abs } # Gotta like groups42
Can you see something like that working out?
----
Maybe sweeten it up:
sub postfix:<G> (\obj) { obj does G }
given 42G { say .G, .abs } # Gotta like groups42
----
NB Declaring an op like that is SLOW. So make sure you're
declaring it just once per test run, not once per individual test.
It *kinda* worked to turn it into a macro to avoid the run-time hit:
use experimental :macros;
macro postfix:<G> (\obj) { quasi { {{{obj}}} does G } }
given 42G { say .G, .abs } # Gotta like groups42
but there's a warning displayed on stderr for the above.
----
Remember you can parameterize G:
role G[:$ass, :$ide, :$inv, :$com] { ... }
given 42 does G[:ass] { say .G, .abs } # Gotta like groups42
I'm not saying that makes any sense whatsoever for what
you want to do, but it seemed worth mentioning.
----
As another tip that may or may not be relevant, but one which is
far more wildly out-of-left-field than role parameterization, indeed
almost a non-sequitur in the context of this discussion, I've found
out that if a NON parameterized role has exactly one public attribute,
you can set its value as part of mixing in a role:
role foo { has $.bar }
given 42 does foo(99) { say .bar } # 99
----
Thoughts?