+ * The class is mutable, allowing the values of the left and right elements to be changed
+ * after creation. It also overrides the {@code equals}, {@code hashCode}, and {@code toString}
+ * methods to provide meaningful comparisons and string representations.
+ *
+ * @param
+ * Two {@code BiTuple}s are considered equal if they are of the same type and their left and
+ * right elements are equal according to their respective {@code equals} methods.
+ *
+ * @param object the object to compare with this {@code BiTuple}
+ * @return {@code true} if the specified object is equal to this {@code BiTuple},
+ * {@code false} otherwise
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (!(object instanceof BiTuple, ?> biTuple)) return false;
+ return Objects.equals(left, biTuple.left) && Objects.equals(right, biTuple.right);
+ }
+
+ /**
+ * Returns a hash code value for the {@code BiTuple}.
+ *
+ * The hash code is calculated based on the hash codes of the left and right elements.
+ *
+ * @return a hash code value for this {@code BiTuple}
+ */
+ @Override
+ public int hashCode() {
+ return Objects.hash(left, right);
+ }
+
+ /**
+ * Returns a string representation of the {@code BiTuple}.
+ *
+ * The string representation consists of the class name, followed by the values of
+ * the left and right elements in the format {@code "BiTuple{left=value1, right=value2}"}.
+ *
+ * @return a string representation of the {@code BiTuple}
+ */
+ @Override
+ public String toString() {
+ return "BiTuple{" +
+ "left=" + left +
+ ", right=" + right +
+ '}';
+ }
+
+ /**
+ * Creates a new {@code BiTuple} with the specified left and right elements.
+ *
+ * @param
+ * The generic types {@code L} and {@code R} denote the types of the left and right elements,
+ * respectively. Instances of this class are immutable once created.
+ *
+ * @param
+ * The generic types {@code L}, {@code M}, and {@code R} denote the types of the left, middle, and
+ * right elements, respectively. Instances of this class are immutable once created.
+ *
+ * @param
+ * The generic types {@code L}, {@code M} and {@code R} denote the types of the left, middle and
+ * right elements respectively.
+ *
+ * @param