/**
 * null check
 * @param value
 * @returns {boolean}
 */
export function isNull(value: unknown) {
    return value === null;
}

/**
 * object check
 * @param value
 * @returns {boolean}
 */
export function isObject(value: unknown) {
    return value
        ? typeof value === 'object' && !Array.isArray(value) && !isNull(value)
        : false;
}

/**
 * function check
 * @param value
 * @returns {*|boolean}
 */
export function isFunction(value: unknown) {
    return value ? typeof value === 'function' : false;
}

/**
 * string check
 * @param value
 * @return {boolean}
 */
export function isString(value: unknown) {
    return typeof value === 'string';
}

/**
 * number check
 * @param value
 * @return {boolean}
 */
export function isNumber(value: unknown) {
    return typeof value === 'number';
}

/**
 * boolean check
 * @param value
 * @return {boolean}
 */
export function isBoolean(value: unknown) {
    return typeof value === 'boolean';
}

/**
 * array check
 * @param value
 * @returns {arg is Array<unknown>}
 */
export function isArray(value: unknown) {
    return Array.isArray(value);
}

/**
 * undefined check
 * @param value
 * @returns {boolean}
 */
export function isUndefined(value: unknown): value is undefined {
    return typeof value === 'undefined';
}

/**
 * URL check
 * @param url
 * @returns {boolean}
 */
const IS_VALID_URL_REGEX = /^(http|https):\/\/[^ "]+$/;

export function isValidUrl(url: string) {
    return IS_VALID_URL_REGEX.test(url);
}

/**
 * ISO language code check
 * @param url
 * @returns {boolean}
 */
const IS_VALID_ISO_REGEX = /^[a-z]{2}$/;

export function isValidISOCode(code: string) {
    return IS_VALID_ISO_REGEX.test(code);
}
