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 Pairs. 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»