import { HKT, I, _ } from "../hkt"; import { $Fold } from "../hkt/list"; import { List, IsEmpty } from "../list"; import { Satisfies, Unreachable } from "../type"; /** * gets the boolean XOR of booleans `A` and `B` * * @remarks * does not distribute over `A` or `B`. * * @undefined_behavior `A` is `any`, `unknown`, `never`, or `boolean` * @undefined_behavior `B` is `any`, `unknown`, `never`, or `boolean` * * @since 0.0.2 * * @example * ```ts * type e0 = Xor // false * type e1 = Xor // true * type e2 = Xor // true * type e3 = Xor // false * ``` */ export type Xor = [ A ] extends [true] ? [B] extends [false] ? true : false : [A] extends [false] ? [B] extends [true] ? true : false : false; export declare namespace Xor { /** * gets the boolean XOR of booleans `A` and `B` * * @remarks * distributes over `A` and `B` * * @undefined_behavior `A` is `any`, `unknown`, `never`, or `boolean` * @undefined_behavior `B` is `any`, `unknown`, `never`, or `boolean` * * @since 0.0.9 */ export type Distributive = A extends true ? B extends false ? true : false : A extends false ? B extends true ? true : false : false; interface _Xor extends HKT<[boolean, boolean], boolean> { [HKT.i]: Satisfies<_, [boolean, boolean]>; [HKT.o]: I extends [infer A extends boolean, infer B extends boolean] ? Xor : Unreachable; } /** * unbounded logical XOR (PARITY mod 2) * * @undefined_behavior an element is `any`, `unknown`, `never`, or `boolean` * * @since 0.0.9 */ export type Unbounded, Vacuous = false> = IsEmpty extends true ? Vacuous : $Fold<_Xor, false, L>; export {}; } //# sourceMappingURL=xor.d.ts.map