import { And } from "./and"; import { IsStringLiteral } from "./is-string-literal"; import { IsEmptyString } from "./string"; type _AreAnagrams< Str1 extends string, Str2 extends string > = IsEmptyString extends true ? IsEmptyString extends true ? true : false : Str1 extends `${infer First extends string}${infer Rest1 extends string}` ? Str2 extends `${infer Prev extends string}${First}${infer Rest2 extends string}` ? _AreAnagrams : false : never; /** * Returns a boolean whether two passed string literals are anagrams * @example * ```ts * // true * type Case1 = AreAnagrams<"name", "eman"> * // false * type Case1 = AreAnagrams<"name", "emand"> * ``` */ export type AreAnagrams = And< IsStringLiteral, IsStringLiteral > extends true ? _AreAnagrams : false;