/**
* **This module is experimental.**
*
* Not to be confused with TypeScript's enums, this module refers to
* enumeration, modelled similarly to PureScript's `BoundedEnum`.
*
* Most functions in this module are extremely expensive if called on instances
* of very large types.
*
* @since 0.17.0
*/
import type { Bounded } from "fp-ts/Bounded";
import * as O from "fp-ts/Option";
import type { Ord } from "fp-ts/Ord";
type Option = O.Option;
import * as NEA from "fp-ts/NonEmptyArray";
type NonEmptyArray = NEA.NonEmptyArray;
import type { Eq } from "fp-ts/Eq";
import * as L from "./Lazy";
type Lazy = L.Lazy;
/**
* Typeclass for finite enumerations.
*
* The retraction laws state that when operations succeed, `succ` and `pred`
* reverse one-another:
* pred >=> succ >=> pred = pred
* succ >=> pred >=> succ = succ
*
* The non-skipping laws state that calls to `succ` and `pred` should not skip
* any members of the given type. For example, an instance for a sum type of
* ordered members `A`, `B`, and `C` should traverse the members like so:
* `A <-> B <-> C`, skipping no member and following the order defined by the
* `Ord` instance.
*
* `fromEnum` should always return an integer. `toEnum` should not accept
* non-integer inputs. They should both be zero-based.
*
* @example
* import * as Bool from 'fp-ts-std/Boolean'
* import { universe } from 'fp-ts-std/Enum'
*
* assert.deepStrictEqual(universe(Bool.Enum), [false, true])
*
* @category 0 Types
* @since 0.17.0
*/
export type Enum = Bounded & {
succ: (x: A) => Option;
pred: (x: A) => Option;
toEnum: (index: number) => Option;
fromEnum: (x: A) => number;
cardinality: Lazy;
};
/**
* Returns a contiguous sequence of elements between `start` and `end`
* inclusive. Behaviour is unspecified if `end` is not greater than `start`.
*
* @example
* import { fromTo } from 'fp-ts-std/Enum'
* import { EnumInt } from 'fp-ts-std/Number'
*
* const range = fromTo(EnumInt)
*
* assert.deepStrictEqual(range(0)(3), [0, 1, 2, 3])
*
* @category 2 Typeclass Methods
* @since 0.17.0
*/
export declare const fromTo: (E: Enum) => (start: A) => (limit: A) => NonEmptyArray;
/**
* Returns a sequence of elements from `first` until `limit` with step size
* determined by the difference between `first` and `second`. Behaviour is
* unspecified if `end` is not greater than `start` or `step` is non-positive.
*
* @example
* import { fromThenTo } from 'fp-ts-std/Enum'
* import { EnumInt } from 'fp-ts-std/Number'
*
* const f = fromThenTo(EnumInt)
*
* assert.deepStrictEqual(f(0)(2)(6), [0, 2, 4, 6])
* assert.deepStrictEqual(f(0)(3)(5), [0, 3])
*
* @category 2 Typeclass Methods
* @since 0.17.0
*/
export declare const fromThenTo: (E: Enum) => (first: A) => (second: A) => (limit: A) => NonEmptyArray;
/**
* Produces all successors of `start` exclusive.
*
* @example
* import { upFromExcl } from 'fp-ts-std/Enum'
* import { Enum as EnumBool } from 'fp-ts-std/Boolean'
*
* const f = upFromExcl(EnumBool)
*
* assert.deepStrictEqual(f(false), [true])
* assert.deepStrictEqual(f(true), [])
*
* @category 2 Typeclass Methods
* @since 0.17.0
*/
export declare const upFromExcl: (E: Enum) => (start: A) => A[];
/**
* Produces all successors of `start` inclusive.
*
* @example
* import { upFromIncl } from 'fp-ts-std/Enum'
* import { Enum as EnumBool } from 'fp-ts-std/Boolean'
*
* const f = upFromIncl(EnumBool)
*
* assert.deepStrictEqual(f(false), [false, true])
* assert.deepStrictEqual(f(true), [true])
*
* @category 2 Typeclass Methods
* @since 0.17.0
*/
export declare const upFromIncl: (E: Enum) => (start: A) => NonEmptyArray;
/**
* Produces all predecessors of `start` exclusive.
*
* @example
* import { downFromExcl } from 'fp-ts-std/Enum'
* import { Enum as EnumBool } from 'fp-ts-std/Boolean'
*
* const f = downFromExcl(EnumBool)
*
* assert.deepStrictEqual(f(true), [false])
* assert.deepStrictEqual(f(false), [])
*
* @category 2 Typeclass Methods
* @since 0.17.0
*/
export declare const downFromExcl: (E: Enum) => (end: A) => A[];
/**
* Produces all predecessors of `start` inclusive.
*
* @example
* import { downFromIncl } from 'fp-ts-std/Enum'
* import { Enum as EnumBool } from 'fp-ts-std/Boolean'
*
* const f = downFromIncl(EnumBool)
*
* assert.deepStrictEqual(f(true), [true, false])
* assert.deepStrictEqual(f(false), [false])
*
* @category 2 Typeclass Methods
* @since 0.17.0
*/
export declare const downFromIncl: (E: Enum) => (start: A) => NonEmptyArray;
/**
* Provides a default, inefficient implementation of `cardinality`.
*
* @example
* import { defaultCardinality } from 'fp-ts-std/Enum'
* import { Enum as EnumBool } from 'fp-ts-std/Boolean'
*
* assert.strictEqual(defaultCardinality(EnumBool), 2)
*
* @category 3 Functions
* @since 0.17.0
*/
export declare const defaultCardinality: (E: Omit, "cardinality">) => number;
/**
* Enumerates every value of an `Enum` in ascending order.
*
* @example
* import { universe } from 'fp-ts-std/Enum'
* import { Enum as EnumBool } from 'fp-ts-std/Boolean'
*
* assert.deepStrictEqual(universe(EnumBool), [false, true])
*
* @category 2 Typeclass Methods
* @since 0.17.0
*/
export declare const universe: (E: Enum) => NonEmptyArray;
/**
* Creates a fallible function that's the inverse of `f`. `f` is expected to
* return distinct `B` values for any given `A`; behaviour when this is not the
* case is unspecified.
*
* Inverse mapping can be thought of as akin to a partial isomorphism. If the
* types are totally isomorphic, consider instead defining an isomorphism to do
* away with the infallibility.
*
* @example
* import { inverseMap } from 'fp-ts-std/Enum'
* import { Enum as EnumBool } from 'fp-ts-std/Boolean'
* import { Show as ShowBool } from 'fp-ts/boolean'
* import * as Str from 'fp-ts/string'
* import * as O from 'fp-ts/Option'
*
* const parseBool = inverseMap(EnumBool)(Str.Eq)(ShowBool.show)
*
* assert.deepStrictEqual(parseBool("true"), O.some(true))
* assert.deepStrictEqual(parseBool("false"), O.some(false))
* assert.deepStrictEqual(parseBool("foobar"), O.none)
*
* @category 2 Typeclass Methods
* @since 0.17.0
*/
export declare const inverseMap: (E: Enum) => (Eq: Eq) => (f: (x: A) => B) => (x: B) => Option;
/**
* Produces an Enum instance that's potentially both unlawful and unsafe from a
* list of values. Convenient for partially enumerating wide or deep types that
* contain a few very large types such as strings.
*
* The instance will be unsafe if `xs` does not contain every member of `A`. If
* this is the case, the only function that can throw is `fromEnum`.
*
* Behaviour in case of duplicate values is unspecified.
*
* @example
* import { Enum, getUnsafeConstantEnum } from 'fp-ts-std/Enum'
* import * as Bool from 'fp-ts/boolean'
* import { Enum as EnumBool1 } from 'fp-ts-std/Boolean'
*
* // A safe instance equivalent to the real instance albeit with worse
* // performance characteristics.
* const EnumBool2: Enum = getUnsafeConstantEnum(Bool.Ord)([false, true])
*
* assert.strictEqual(EnumBool2.fromEnum(true), 1)
*
* assert.strictEqual(EnumBool1.fromEnum(true), EnumBool2.fromEnum(true))
* assert.strictEqual(EnumBool1.fromEnum(false), EnumBool2.fromEnum(false))
*
* @category 1 Typeclass Instances
* @since 0.17.0
*/
export declare const getUnsafeConstantEnum: (Ord: Ord) => (xs: NonEmptyArray) => Enum;
export {};
//# sourceMappingURL=Enum.d.ts.map