interface ContainerBaseOptions {
    start?: number;
    end?: number;
}

interface ContainerRangeOptions extends ContainerBaseOptions {
    isEmpty?: boolean;
}

interface ContainerEachOptions extends ContainerBaseOptions {
    reverse?: boolean;
}

interface ContainerTakeWhileOptions extends ContainerEachOptions {
    withStart?: boolean;
    withEnd?: boolean;
}

interface ContainerCascadeOptions<T> {
    self?: boolean;
    count?: number;
    also?: (item: T) => unknown;
    error?: IteratorPredicate<T, boolean>;
    hadError?: boolean;
}

interface ContainerCascadeAction<T> {
    cascade?: boolean | IteratorPredicate<T, boolean>;
}

interface ContainerFindOptions<T> extends ContainerCascadeOptions<T>, ContainerCascadeAction<T>, ContainerBaseOptions {
    cascade?: boolean | IteratorPredicate<T, boolean>;
}

interface ContainerRemoveIfOptions<T> extends ContainerCascadeOptions<T>, ContainerCascadeAction<T> {}

interface ContainerIncludesOptions<T> extends ContainerCascadeAction<T>, ContainerBaseOptions {}

interface UnitOptions extends MeasureTextOptions {
    strict?: boolean;
    safe?: boolean;
    screenDimension?: Dimension | null;
    tagName?: string;
    attr?: CssStyleAttr;
    /** @deprecated attr */
    styleAttr?: CssStyleAttr;
    element?: StyleElement | null;
    containerDimension?: Readonly<ContainerDimension>[] | null;
    fallback?: number;
}

interface CalculateOptions extends UnitOptions {
    min?: number;
    max?: number;
    boundingSize?: number;
    unitType?: number;
    zeroThreshold?: number;
}

interface CalculateVarAsStringOptions extends CalculateOptions {
    boundingBox?: Dimension | null;
    dimension?: DimensionAttr | DimensionAttr[];
    orderedSize?: number[] | undefined;
    parent?: boolean;
    roundValue?: boolean;
    precision?: number;
    separator?: string;
    checkUnit?: boolean;
    edgeOffsets?: boolean;
    autoSize?: boolean;
    supportPercent?: boolean;
    /** @deprecated */
    errorString?: RegExp;
}

interface CalculateVarOptions extends Omit<CalculateVarAsStringOptions, "orderedSize" | "checkUnit" | "separator"> {
    dimension?: DimensionAttr;
}

interface CreateElementOptions {
    parent?: HTMLElement | Node;
    prepend?: boolean;
    attributes?: AnyObject;
    style?: CssStyleMap;
    children?: Element[];
}

interface TransformOptions extends UnitOptions {
    type?: number;
    boundingBox?: Dimension | null;
    accumulate?: boolean;
}

interface DelimitStringOptions {
    value: string;
    delimiter?: string;
    trim?: boolean;
    remove?: boolean;
    sort?: FunctionSort<string> | boolean;
    not?: string[];
}

interface ParseUnitOptions extends UnitOptions {
    lineHeight?: number;
    fixedWidth?: boolean;
    typedOM?: boolean;
}

interface ParseStyleValueOptions {
    boundingBox?: Dimension | null;
    percent?: boolean;
    fallback?: boolean;
}

interface ConvertUnitOptions extends ParseUnitOptions {
    precision?: number;
}

interface MeasureTextOptions {
    fontSize?: number | string;
    fontFamily?: string;
}

interface MatchContainerOptions extends Partial<ContainerData> {
    bounds?: DOMRect;
    /** @deprecated */
    conditionStyle?: boolean;
    prefix?: string;
}

interface CloneObjectOptions<T extends object> {
    target?: T;
    deep?: boolean;
    typedArray?: boolean;
    structured?: boolean;
}

interface SplitEnclosingOptions {
    trim?: boolean;
    start?: number;
    startWith?: number;
    count?: number;
}

interface AttrTypeOptions {
    element?: StyleElement;
    type?: string;
}