=begin pod

=TITLE class NumStr

=SUBTITLE Dual Value Floating-point number and String

    class NumStr is Num is Str { }

The dual value types (often referred to as L<allomorphs|/language/glossary#Allomorph>)
allow for the representation of a value as both a string and a numeric type, typically
they will be created for you when the context is "stringy" but they can be determined
to be numbers, such as in some L<quoting constructs|/language/quoting>:

    my $f = <42.1e0>; say $f.WHAT; # OUTPUT: «(NumStr)␤»

As a subclass of both L«C<Num>|/type/Num» and L«C<Str>|/type/Str», a C<NumStr>
will be accepted where either is expected. However, C<NumStr> does not share
object identity with C<Num>- or C<Str>-only variants:

    my $num-str = <42e10>;
    my Num $num = $num-str; # OK!
    my Str $str = $num-str; # OK!
    say 42e10 ∈ <42e10  55  1>; # False; ∈ operator cares about object identity

=head1 Methods

=head2 method new

    method new(Num $i, Str $s)

The constructor requires both the C<Num> and the C<Str> value, when constructing one
directly the values can be whatever is required:

    my $f = NumStr.new(42.1e0, "forty two and a bit");
    say +$f; # OUTPUT: «42.1␤»
    say ~$f; # OUTPUT: «"forty two and a bit"␤»

=head2 method Numeric

    method Numeric

The numeric coercion is applied when the C<NumStr> is used in a numeric context,
such as a numeric comparison or smart match against a numeric value. It will return
the C<Num> value.

=head2 method Num

    method Num

Returns the C<Num> value of the C<NumStr>.

=head2 method Str

Returns the string value of the C<NumStr>.

=head1 Operators

=head2 infix cmp

    multi sub infix:<cmp>(NumStr:D $a, NumStr:D $b)

Compare two C<NumStr> objects.  The comparison is done on the C<Num> value first and
then on the C<Str> value. If you want to compare in a different order then you would
coerce to a C<Num> or C<Str> value first:

    my $f = NumStr.new(42.1e0, "smaller");
    my $g = NumStr.new(43.1e0, "larger");
    say $f cmp $g;          # OUTPUT: «Less␤»
    say $f.Str cmp $g.Str;  # OUTPUT: «More␤»

=end pod

# vim: expandtab shiftwidth=4 ft=perl6
