# class FatRat

class FatRat is Cool does Rational[Int, Int]

A `FatRat`

is a rational number stored with arbitrary size numerator and denominator. Arithmetic operations involving a `FatRat`

and optionally Int or Rat objects return a `FatRat`

, avoiding loss of precision.

Since, unlike Rat, FatRat arithmetics do not fall back Num at some point, there is a risk that repeated arithmetic operations generate pathologically large numerators and denominators.

There are two common ways to generate `FatRat`

objects: through the `FatRat.new(Int, Int)`

constructor, which generates them from numerator and denominator, or by calling the `.FatRat`

method on an Int or Rat object.

# Methods supplied by role Rational

FatRat does role Rational, which provides the following methods:

## method new

method new(NuT:D $numerator, DenomT:D $denominator) returns Rational:D

Creates a new rational object from numerator and denominator.

## method numerator

method numerator(Rational:D:) returns NuT:D

Returns the numerator.

## method denominator

method denominator(Rational:D:) returns DenomT:D

Returns the denominator.

## method nude

method nude(Rational:D:) returns Positional

Returns a list of the numerator and denominator.

## method norm

method norm(Rational:D:) returns Rational:D

Returns a normalized Rational object, i.e. with positive denominator, and numerator and denominator coprime.

# Methods supplied by class Any

FatRat inherits from class Any, which provides the following methods:

## method ACCEPTS

multi method ACCEPTS(Any:D: Mu $other)

Returns `True`

if `$other === self`

(i.e. it checks object identity).

## method any

Interprets the invocant as a list and creates an `any`

-Junction from it.

## method all

Interprets the invocant as a list and creates an `all`

-Junction from it.

## method one

Interprets the invocant as a list and creates an `one`

-Junction from it.

## method none

Interprets the invocant as a list and creates an `none`

-Junction from it.

# Methods supplied by class Mu

FatRat inherits from class Mu, which provides the following methods:

## method Str

multi method Str() returns Str

Returns a string representation of the invocant, intended to be machine readable.

## method clone

method clone(*%twiddles)

Creates a shallow clone of the invocant. If named arguments are passed to it, their values are used in every place where an attribute name matches the name of a named argument.

## method new

multi method new(*%attrinit)

Default method for constructing (create + initialize) new objects of a class. This method expects only named arguments which are then used to initialize attributes with accessors of the same name.

Classes may provide their own `new`

method to override this default.

## method bless

method bless(*%attrinit) returns Mu:D

Lower-level object construction method than `new`

.

Creates a new object of the same type as the invocant, uses the named arguments to initialize attributes, and returns the created object.

You can use this method when writing custom constructors:

class Point { has $.x; has $.y; multi method new($x, $y) { self.bless(:$x, :$y); } } my $p = Point.new(-1, 1);

(Though each time you write a custom constructor, remember that it makes subclassing harder).

## method CREATE

method CREATE() returns Mu:D

Allocates a new object of the same type as the invocant, without initializing any attributes.

## method print

multi method print() returns Bool:D

Prints value to `$*OUT`

after stringification using `.Str`

method without newline at end.

## method say

multi method say() returns Bool:D

Prints value to `$*OUT`

after stringification using `.gist`

method with newline at end.

## method ACCEPTS

multi method ACCEPTS(Mu:U: $other)

Performs a type check. Returns `True`

if `$other`

conforms to the invocant (which is always a type object or failure).

This is the method that is triggered on smart-matching against type objects, for example in `if $var ~~ Int { ... }`

.

## method WHICH

multi method WHICH() returns ObjAt:D

Returns an object of type ObjAt which uniquely identifies the object. Value types override this method which makes sure that two equivalent objects return the same return value from `WHICH`

.