infix cmp
Documentation for infix cmp
assembled from the following types:
language documentation Operators
From Operators
(Operators) infix cmp
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 lenghts differ.
"abcd" cmp "abcde" # OUTPUT: «Less»"abcd " cmp "abcde" # OUTPUT: «Less»'A' cmp 'Ẳ' # OUTPUT: «Less»
class RatStr
From RatStr
(RatStr) infix cmp
multi sub infix:<cmp>(RatStr , RatStr )
Compare two RatStr
objects. The comparison is done on the Rat
value first and then on the Str
value. If you want to compare in a different order then you would coerce to the Rat
or Str
values first:
my = RatStr.new(42.1, "smaller");my = RatStr.new(43.1, "larger");say cmp ; # OUTPUT: «Less»say .Str cmp .Str; # OUTPUT: «More»
class ComplexStr
From ComplexStr
(ComplexStr) infix cmp
multi sub infix:<cmp>(ComplexStr , ComplexStr )
Compare two ComplexStr
objects. The comparison is done on the Complex
value first and then on the Str
value. If you want to compare in a different order then you would coerce to the Complex
or Str
values first:
my = ComplexStr.new(42+0i, "smaller");my = ComplexStr.new(43+0i, "larger");say cmp ; # OUTPUT: «Less»say .Str cmp .Str; # OUTPUT: «More»
class IntStr
From IntStr
(IntStr) infix cmp
multi sub infix:<cmp>(IntStr , IntStr )
Compare two IntStr
objects. The comparison is done on the Int
value first and then on the Str
value. If you want to compare in a different order then you would coerce to an Int
or Str
value first:
my = IntStr.new(42, "smaller");my = IntStr.new(43, "larger");say cmp ; # OUTPUT: «Less»say .Str cmp .Str; # OUTPUT: «More»
class Pair
From Pair
(Pair) infix cmp
Defined as:
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»
class NumStr
From NumStr
(NumStr) infix cmp
multi sub infix:<cmp>(NumStr , NumStr )
Compare two NumStr
objects. The comparison is done on the Num
value first and then on the Str
value. If you want to compare in a different order then you would coerce to a Num
or Str
value first:
my = NumStr.new(42.1e0, "smaller");my = NumStr.new(43.1e0, "larger");say cmp ; # OUTPUT: «Less»say .Str cmp .Str; # OUTPUT: «More»
enum Order
From Order
(Order) infix cmp
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.
class List
From List
(List) infix cmp
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»