/**
 * Returns a fresh copy of the passed in value
 *
 * @param {unknown} toClone A value to clone
 * @returns {unknown} A clone of the input
 */
function DeepClone(toClone) {
    return JSON.parse(JSON.stringify(toClone));
}

/**
 * Check whether the value at a specific spot in a number is non-zero
 *
 * Similar to the bitwise & operator, checks a "place" in a decimal number
 * to see if it has a non-zero value.
 *
 * @example
 * const test = 107;
 * console.log(DecimalPlaceIsNonZero(test, 1)) // true
 * console.log(DecimalPlaceIsNonZero(test, 2)) // false
 * console.log(DecimalPlaceIsNonZero(test, 3)) // true
 *
 * @param {number} input The number to check
 * @param {number} place The power of 10 to check against
 * @returns {boolean} Whether the value in that number's place is non-zero
 */
function DecimalPlaceIsNonZero(input, place) {
    return !!GetDecimalInPlace(input, place);
}

/**
 * Get the digit in a given place of a decimal number
 *
 * @param {number} input The number to check
 * @param {number} place The power of 10 to check against
 * @returns {number} The number at the specified place in the input
 */
function GetDecimalInPlace(input, place) {
    return Math.floor((input / (10 ** place)) % 10);
}

module.exports = {
    DeepClone: DeepClone,
    DecimalPlaceIsNonZero: DecimalPlaceIsNonZero,
    GetDecimalInPlace: GetDecimalInPlace,
};