Rationnal.java
package calculator.atoms;
import calculator.Expression;
import calculator.operations.Operation;
import calculator.atoms.visitor.AtomVisitor;
import calculator.functions.BinaryFunction;
import calculator.functions.UnaryFunction;
import visitor.Visitor;
import java.util.Objects;
/**
* Rationnal Number type is used to represent fractions e.g. 1/2
*
* @see Expression
* @see Operation
* @see Atom
*/
public class Rationnal implements Atom {
private final org.apache.commons.numbers.fraction.Fraction value;
/**
* Constructor method
* * @param numerator The numerator
*
* @param denominator The denominator
*/
public Rationnal(int numerator, int denominator) {
try {
this.value = org.apache.commons.numbers.fraction.Fraction.of(numerator, denominator);
} catch (ArithmeticException e) {
throw new IllegalArgumentException("Denominator cannot be zero", e);
}
}
/**
* Constructor method for a whole number
* * @param value The integer value (e.g., 5 becomes 5/1)
*/
public Rationnal(int value) {
this.value = org.apache.commons.numbers.fraction.Fraction.of(value);
}
/**
* Constructor method from an existing Fraction object
* * @param value The commons-numbers Fraction object
*/
public Rationnal(org.apache.commons.numbers.fraction.Fraction value) {
this.value = value;
}
/**
* getter method to obtain the value contained in the object
*
* @return The commons-numbers Fraction number contained in the object
*/
public org.apache.commons.numbers.fraction.Fraction getValue() {
return value;
}
@Override
public Atom apply(Operation o, Atom a) {
return o.op(this, (Rationnal) a);
}
@Override
public Atom apply(BinaryFunction f, Atom a) {
return f.op(this, (Rationnal) a);
}
@Override
public Rationnal apply(UnaryFunction o) {
return o.op(this);
}
@Override
public void accept(AtomVisitor v) {
v.visit(this);
}
@Override
public void accept(Visitor v) {
v.visit(this);
}
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (this == o)
return true;
if (!(o instanceof Rationnal))
return false;
Rationnal other = (Rationnal) o;
return this.value.equals(other.getValue());
}
@Override
public int hashCode() {
return Objects.hash(value);
}
public int getNumerator() {
return value.getNumerator();
}
public int getDenominator() {
return value.getDenominator();
}
@Override
public String toString(){ return value.toString(); };
}