From b63526d1b14c4dc2aa71a03f9ca6cc7aefed490e Mon Sep 17 00:00:00 2001
From: Lexus Drumgold <unicornware@flexdevelopment.llc>
Date: Sat, 13 May 2023 04:31:41 -0400
Subject: [PATCH] feat(types): `IsAny`, `IfAny`

Signed-off-by: Lexus Drumgold <unicornware@flexdevelopment.llc>
---
 src/types/__tests__/if-any.spec-d.ts | 19 +++++++++++++++++++
 src/types/__tests__/is-any.spec-d.ts | 16 ++++++++++++++++
 src/types/if-any.ts                  | 19 +++++++++++++++++++
 src/types/index.ts                   |  2 ++
 src/types/is-any.ts                  | 13 +++++++++++++
 5 files changed, 69 insertions(+)
 create mode 100644 src/types/__tests__/if-any.spec-d.ts
 create mode 100644 src/types/__tests__/is-any.spec-d.ts
 create mode 100644 src/types/if-any.ts
 create mode 100644 src/types/is-any.ts

diff --git a/src/types/__tests__/if-any.spec-d.ts b/src/types/__tests__/if-any.spec-d.ts
new file mode 100644
index 00000000..a6bb5f5e
--- /dev/null
+++ b/src/types/__tests__/if-any.spec-d.ts
@@ -0,0 +1,19 @@
+/**
+ * @file Type Tests - IfAny
+ * @module tutils/types/tests/unit-d/IfAny
+ */
+
+import type TestSubject from '../if-any'
+
+describe('unit-d:types/IfAny', () => {
+  type False = false
+  type True = true
+
+  it('should equal False if IsAny<T> extends false', () => {
+    expectTypeOf<TestSubject<any[], True, False>>().toEqualTypeOf<False>()
+  })
+
+  it('should equal True if IsAny<T> extends true', () => {
+    expectTypeOf<TestSubject<any, True, False>>().toEqualTypeOf<True>()
+  })
+})
diff --git a/src/types/__tests__/is-any.spec-d.ts b/src/types/__tests__/is-any.spec-d.ts
new file mode 100644
index 00000000..d1815043
--- /dev/null
+++ b/src/types/__tests__/is-any.spec-d.ts
@@ -0,0 +1,16 @@
+/**
+ * @file Type Tests - IsAny
+ * @module tutils/types/tests/unit-d/IsAny
+ */
+
+import type TestSubject from '../is-any'
+
+describe('unit-d:types/IsAny', () => {
+  it('should equal false if T is not any', () => {
+    expectTypeOf<TestSubject<number>>().toEqualTypeOf<false>()
+  })
+
+  it('should equal true if T is any', () => {
+    expectTypeOf<TestSubject<any>>().toEqualTypeOf<true>()
+  })
+})
diff --git a/src/types/if-any.ts b/src/types/if-any.ts
new file mode 100644
index 00000000..8ae3b083
--- /dev/null
+++ b/src/types/if-any.ts
@@ -0,0 +1,19 @@
+/**
+ * @file Type Definitions - IfAny
+ * @module tutils/types/IfAny
+ */
+
+import type IsAny from './is-any'
+
+/**
+ * Conditional type that resolves depending on whether or not `T` is type `any`.
+ *
+ * @see {@linkcode IsAny}
+ *
+ * @template T - Type to evaluate
+ * @template True - Type if `T` is type `any`
+ * @template False - Type if `T` is not type `any`
+ */
+type IfAny<T, True, False> = IsAny<T> extends true ? True : False
+
+export type { IfAny as default }
diff --git a/src/types/index.ts b/src/types/index.ts
index dbe3f8b4..2a45a8cb 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -22,7 +22,9 @@ export type { default as Fallback } from './fallback'
 export type { default as FIXME } from './fixme'
 export type { default as Fn } from './fn'
 export type { default as Get } from './get'
+export type { default as IfAny } from './if-any'
 export type { default as IndexSignature } from './index-signature'
+export type { default as IsAny } from './is-any'
 export type { default as IsTuple } from './is-tuple'
 export type { default as Join } from './join'
 export type { default as JsonArray } from './json-array'
diff --git a/src/types/is-any.ts b/src/types/is-any.ts
new file mode 100644
index 00000000..9bd1434a
--- /dev/null
+++ b/src/types/is-any.ts
@@ -0,0 +1,13 @@
+/**
+ * @file Type Definitions - IsAny
+ * @module tutils/types/IsAny
+ */
+
+/**
+ * Returns a boolean indicating if `T` is type `any`.
+ *
+ * @template T - Type to evaluate
+ */
+type IsAny<T> = 0 extends T & 1 ? true : false
+
+export type { IsAny as default }