    module Graphics.Vty.Attributes.Color where
    import Data.Word

    -- | Abstract data type representing a color.
    --
    -- Currently the foreground and background color are specified as points in either a:
    --
    --  * 16 color palette. Where the first 8 colors are equal to the 8 colors of the ISO 6429 (ANSI) 8
    --  color palette and the second 8 colors are bright/vivid versions of the first 8 colors.
    --
    --  * 240 color palette. This palette is a regular sampling of the full RGB colorspace for the first
    --  224 colors. The remaining 16 colors is a greyscale palette.
    --
    -- The 8 ISO 6429 (ANSI) colors are as follows:
    --
    --      0. black
    --
    --      1. red
    --
    --      2. green
    --
    --      3. yellow
    --
    --      4. blue
    --
    --      5. magenta
    --
    --      6. cyan
    --
    --      7. white
    --
    -- The mapping from points in the 240 color palette to colors actually displayable by the terminal
    -- depends on the number of colors the terminal claims to support. Which is usually determined by
    -- the terminfo "colors" property. If this property is not being accurately reported then the color
    -- reproduction will be incorrect.
    --
    -- If the terminal reports <= 16 colors then the 240 color palette points are only mapped to the 8
    -- color pallete. I'm not sure of the RGB points for the "bright" colors which is why they are not
    -- addressable via the 240 color palette.
    --
    -- If the terminal reports > 16 colors then the 240 color palette points are mapped to the nearest
    -- points in a ("color count" - 16) subsampling of the 240 color palette.
    --
    -- All of this assumes the terminals are behaving similarly to xterm and rxvt when handling colors.
    -- And that the individual colors have not been remapped by the user. There may be a way to verify
    -- this through terminfo but I don't know it.
    --
    -- Seriously, terminal color support is INSANE.
    data Color = ISOColor !Word8 | Color240 !Word8
        deriving ( Eq, Show, Read )