import { AnyFunction } from "./global.cjs";

//#region src/types/utils.d.ts
/**
 * @public
 */
type Expect<T extends true> = T;
/**
 * @public
 */
type ExpectTrue<T extends true> = T;
/**
 * @public
 */
type ExpectFalse<T extends false> = T;
/**
 * @public
 */
type IsTrue<T extends true> = T;
/**
 * @public
 */
type IsFalse<T extends false> = T;
/**
 * ts对函数类型有特殊处理，可以区分any类型
 * @public
 */
type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;
/**
 * @public
 */
type IsEqual<X, Y> = Equal<X, Y>;
/**
 * @public
 */
type NotEqual<X, Y> = true extends Equal<X, Y> ? false : true;
/**
 * any 类型与任何类型的交叉都是 any，也就是 1 & any 结果是 any。
 */
/**
 * @public
 */
type IsAny<T> = 0 extends 1 & T ? true : false;
/**
 * @public
 */
type NotAny<T> = true extends IsAny<T> ? false : true;
/**
 * @public
 */
type Debug<T> = { [K in keyof T]: T[K] };
/**
 * @public
 */
type MergeInsertions<T> = T extends object ? { [K in keyof T]: MergeInsertions<T[K]> } : T;
/**
 * @public
 */
type Alike<X, Y> = Equal<MergeInsertions<X>, MergeInsertions<Y>>;
/**
 * @public
 */
type ExpectExtends<VALUE, EXPECTED> = EXPECTED extends VALUE ? true : false;
/**
 * @public
 */
type ExpectValidArgs<FUNC extends (...args: any[]) => any, ARGS extends any[]> = ARGS extends Parameters<FUNC> ? true : false;
/**
 * 类型编程中的If判断
 * @public
 */
type If<Condition extends boolean, T, F> = Condition extends true ? T : F;
/**
 * Readonly递归版本
 * @public
 */
type DeepReadonly<Obj extends Record<string, any>> = { readonly [Key in keyof Obj]: Obj[Key] extends object ? Obj[Key] extends AnyFunction ? Obj[Key] : DeepReadonly<Obj[Key]> : Obj[Key] };
/**
 * 判断是否是never类型
 * @public
 */
type IsNever<T> = [T] extends [never] ? true : false;
/**
 * 判断是否为元组
 * 元组和数组的区别是，数组的length是number类型
 * @public
 */
type IsTuple<T> = T extends [...params: infer Elements] ? NotEqual<Elements['length'], number> : false;
/**
 * @public
 */
type Nullable<T> = T | null | undefined;
//#endregion
export { Alike, Debug, DeepReadonly, Equal, Expect, ExpectExtends, ExpectFalse, ExpectTrue, ExpectValidArgs, If, IsAny, IsEqual, IsFalse, IsNever, IsTrue, IsTuple, MergeInsertions, NotAny, NotEqual, Nullable };