interface KeyValue<T, out U> {
    key: T;
    value: U;
}

interface RGB {
    r: number;
    g: number;
    b: number;
    a?: number;
}

interface HSL {
    h: number;
    s: number;
    l: number;
    a?: number;
}

interface HWB {
    h: number;
    w: number;
    b: number;
    a?: number;
}

interface ColorSpace {
    name: string;
    values: ColorCoordinates;
    alpha?: number;
    in?: string;
    out?: string | ColorCoordinates | null;
}

interface Point {
    x: number;
    y: number;
    z?: number;
}

interface Dimension<T = number> {
    width: T;
    height: T;
}

type RGBA = Required<RGB>;
type HSLA = Required<HSL>;
type HWBA = Required<HWB>;
type ColorCoordinates = [number, number, number];
type StringValue<T = string> = KeyValue<string, T>;
type NumberValue<T = string> = KeyValue<number, T>;