have perl6 invoke the right multi sub specialized by subtype(subset)
Since all candidates are equally tight, it will take the first one that matches the rest of the constraint (or lack thereof). This is when the order in which the multi candidates are specified, becomes important. If you would have specified them in this order:
multi check(PositiveEven $value) { say "positive & even" }
multi check(Positive $value) { say "positive" }
multi check(Int $value) { say "integer" }
The following will do what you expect:
check(32); # positive & even
The main problem is that Subsets are not actually types, just constraints. If you do
say :(PositiveEven $value).perl;
say :(Positive $value).perl;
say :(Int $value).perl;
You will obtain
:(Int $value where { ... })
:(Int $value where { ... })
:(Int $value)
While the latest one is clearly different, the two others have no difference regarding signature, and thus the first one found is used. You will need either to declare them as classes or find another way to differentiate them by signature, or inside the sub itself using nextsame
proto check($value) { * }
subset PositiveEven of UInt where * %% 2;
multi check(Int $value) {
say "integer"
}
multi check(UInt $value) {
if $value ~~ PositiveEven {
nextsame;
}
say "positive"
}
multi check(PositiveEven $value) {
say "positive & even"
}
This will return positive & even
as expected. You don't even need to define the last sub's arg as PositiveEven
, but it's OK to leave it there for informative purposes.