See Original text in context
multi sub infix:<cmp>(Any, Any)multi sub infix:<cmp>(Real, Real)multi sub infix:<cmp>(Str, Str)multi sub infix:<cmp>(Version, Version)
Generic, "smart" three-way comparator.
Compares strings with string semantics, numbers with number semantics, Pair objects first by key and then by value etc.
if $a eqv $b
, then $a cmp $b
always returns Order::Same
.
say (a => 3) cmp (a => 4); # OUTPUT: «Less»say 4 cmp 4.0; # OUTPUT: «Same»say 'b' cmp 'a'; # OUTPUT: «More»
Strings are compared codepoint by codepoint; if leading codepoints are the same, the result of comparing the first differing codepoint is returned or the longer string if their lengths differ.
"abcd" cmp "abcde"; # OUTPUT: «Less»"abcd " cmp "abcde"; # OUTPUT: «Less»'A' cmp 'Ẳ'; # OUTPUT: «Less»
See Original text in context
multi sub infix:<cmp>(Allomorph , Allomorph )
Compare two Allomorph
objects. The comparison is done on the Numeric
value first and then on the Str
value. If you want to compare in a different order then you would coerce to an Numeric
or Str
value first:
my = IntStr.new(42, "smaller");my = IntStr.new(43, "larger");say cmp ; # OUTPUT: «Less»say .Str cmp .Str; # OUTPUT: «More»
See Original text in context
multi sub infix:<cmp>(Pair, Pair)
The type-agnostic comparator; compares two Pair
s. Compares first their key parts, and then compares the value parts if the keys are equal.
my = (Apple => 1);my = (Apple => 2);say cmp ; # OUTPUT: «Less»
See Original text in context
multi sub infix:<cmp>(List , List )
Evaluates Lists
by comparing element @a[$i]
with @b[$i]
(for some Int $i
, beginning at 0) and returning Order::Less
, Order::Same
, or Order::More
depending on if and how the values differ. If the operation evaluates to Order::Same
, @a[$i + 1]
is compared with @b[$i + 1]
. This is repeated until one is greater than the other or all elements are exhausted.
If the Lists
are of different lengths, at most only $n
comparisons will be made (where $n = @a.elems min @b.elems
). If all of those comparisons evaluate to Order::Same
, the final value is selected based upon which List
is longer.
say (1, 2, 3) cmp (1, 2, 3); # OUTPUT: «Same»say (4, 5, 6) cmp (4, 5, 7); # OUTPUT: «Less»say (7, 8, 9) cmp (7, 8, 8); # OUTPUT: «More»say (1, 2) cmp (1, 2, 3); # OUTPUT: «Less»say (1, 2, 3) cmp (1, 2); # OUTPUT: «More»say (9).List cmp (^10).List; # OUTPUT: «More»
See Original text in context
multi sub infix:<cmp>(\a, \b --> Order)
cmp
will first try to compare operands as strings (via coercion to Stringy), and, failing that, will try to compare numerically via the <=>
operator or any other type-appropriate comparison operator. See also the documentation for the cmp
operator.