/** * This method returns a value as a boxed object. A value is typically a PHP typed * primitive or object. It is considered type-safe. * * @access public * @static * @param mixed $value the value(s) to be boxed * @return IRatio\Type the boxed object */ public static function make($value) : IRatio\Type { $values = is_array($value) ? $value : func_get_args(); $values = array_map(function ($value) { return $value instanceof IInt32\Type ? $value : IInt32\Type::make($value); }, $values); $denominator = $values[1]; $signum = IInt32\Module::signum($denominator)->unbox(); if ($signum == 0) { throw new Throwable\InvalidArgument\Exception('Unable to create ratio. Denominator must not be zero.'); } $numerator = $values[0]; if (IInt32\Module::signum($numerator)->unbox() == 0) { return IRatio\Type::zero(); } if ($signum < 0) { $numerator = IInt32\Module::negate($numerator); $denominator = IInt32\Module::negate($denominator); } $gcd = IInt32\Module::gcd($numerator, $denominator); if (!IInt32\Module::eq($gcd, IInt32\Type::one())->unbox()) { $numerator = IInt32\Module::divide($numerator, $gcd); $denominator = IInt32\Module::divide($denominator, $gcd); } return new IRatio\Type($numerator, $denominator); }
/** * This method tests the "negate" method. * * @dataProvider data_negate */ public function test_negate(array $provided, array $expected) { $p0 = IInt32\Module::negate(IInt32\Type::box($provided[0])); $e0 = $expected[0]; $this->assertInstanceOf('\\Saber\\Data\\IInt32\\Type', $p0); $this->assertEquals($e0, $p0->unbox()); }
/** * This method returns the result of negating this object's value. * * @access public * @static * @param IRatio\Type $x the operand * @return IRatio\Type the result */ public static function negate(IRatio\Type $x) : IRatio\Type { return IRatio\Type::make(IInt32\Module::negate($x->numerator()), $x->denominator()); }