import Prelude hiding (tan) import Data.Colour import Data.Colour.Names import Data.Colour.SRGB import Data.Function import Data.List import Data.List.NP import Data.Char import System.Environment allNamedColours :: (Floating a, Ord a) => [(String,Colour a)] allNamedColours = orderByDensity . sortBy (cmpColours `on` snd) $ [ ("aliceblue", aliceblue) , ("antiquewhite", antiquewhite) , ("aqua", aqua) , ("aquamarine", aquamarine) , ("azure", azure) , ("beige", beige) , ("bisque", bisque) , ("black", black) , ("blanchedalmond", blanchedalmond) , ("blue", blue) , ("blueviolet", blueviolet) , ("brown", brown) , ("burlywood", burlywood) , ("cadetblue", cadetblue) , ("chartreuse", chartreuse) , ("chocolate", chocolate) , ("coral", coral) , ("cornflowerblue", cornflowerblue) , ("cornsilk", cornsilk) , ("crimson", crimson) , ("cyan", cyan) , ("darkblue", darkblue) , ("darkcyan", darkcyan) , ("darkgoldenrod", darkgoldenrod) , ("darkgray", darkgray) , ("darkgreen", darkgreen) , ("darkgrey", darkgrey) , ("darkkhaki", darkkhaki) , ("darkmagenta", darkmagenta) , ("darkolivegreen", darkolivegreen) , ("darkorange", darkorange) , ("darkorchid", darkorchid) , ("darkred", darkred) , ("darksalmon", darksalmon) , ("darkseagreen", darkseagreen) , ("darkslateblue", darkslateblue) , ("darkslategray", darkslategray) , ("darkslategrey", darkslategrey) , ("darkturquoise", darkturquoise) , ("darkviolet", darkviolet) , ("deeppink", deeppink) , ("deepskyblue", deepskyblue) , ("dimgray", dimgray) , ("dimgrey", dimgrey) , ("dodgerblue", dodgerblue) , ("firebrick", firebrick) , ("floralwhite", floralwhite) , ("forestgreen", forestgreen) , ("fuchsia", fuchsia) , ("gainsboro", gainsboro) , ("ghostwhite", ghostwhite) , ("gold", gold) , ("goldenrod", goldenrod) , ("gray", gray) , ("grey", grey) , ("green", green) , ("greenyellow", greenyellow) , ("honeydew", honeydew) , ("hotpink", hotpink) , ("indianred", indianred) , ("indigo", indigo) , ("ivory", ivory) , ("khaki", khaki) , ("lavender", lavender) , ("lavenderblush", lavenderblush) , ("lawngreen", lawngreen) , ("lemonchiffon", lemonchiffon) , ("lightblue", lightblue) , ("lightcoral", lightcoral) , ("lightcyan", lightcyan) , ("lightgoldenrodyellow", lightgoldenrodyellow) , ("lightgray", lightgray) , ("lightgreen", lightgreen) , ("lightgrey", lightgrey) , ("lightpink", lightpink) , ("lightsalmon", lightsalmon) , ("lightseagreen", lightseagreen) , ("lightskyblue", lightskyblue) , ("lightslategray", lightslategray) , ("lightslategrey", lightslategrey) , ("lightsteelblue", lightsteelblue) , ("lightyellow", lightyellow) , ("lime", lime) , ("limegreen", limegreen) , ("linen", linen) , ("magenta", magenta) , ("maroon", maroon) , ("mediumaquamarine", mediumaquamarine) , ("mediumblue", mediumblue) , ("mediumorchid", mediumorchid) , ("mediumpurple", mediumpurple) , ("mediumseagreen", mediumseagreen) , ("mediumslateblue", mediumslateblue) , ("mediumspringgreen", mediumspringgreen) , ("mediumturquoise", mediumturquoise) , ("mediumvioletred", mediumvioletred) , ("midnightblue", midnightblue) , ("mintcream", mintcream) , ("mistyrose", mistyrose) , ("moccasin", moccasin) , ("navajowhite", navajowhite) , ("navy", navy) , ("oldlace", oldlace) , ("olive", olive) , ("olivedrab", olivedrab) , ("orange", orange) , ("orangered", orangered) , ("orchid", orchid) , ("palegoldenrod", palegoldenrod) , ("palegreen", palegreen) , ("paleturquoise", paleturquoise) , ("palevioletred", palevioletred) , ("papayawhip", papayawhip) , ("peachpuff", peachpuff) , ("peru", peru) , ("pink", pink) , ("plum", plum) , ("powderblue", powderblue) , ("purple", purple) , ("red", red) , ("rosybrown", rosybrown) , ("royalblue", royalblue) , ("saddlebrown", saddlebrown) , ("salmon", salmon) , ("sandybrown", sandybrown) , ("seagreen", seagreen) , ("seashell", seashell) , ("sienna", sienna) , ("silver", silver) , ("skyblue", skyblue) , ("slateblue", slateblue) , ("slategray", slategray) , ("slategrey", slategrey) , ("snow", snow) , ("springgreen", springgreen) , ("steelblue", steelblue) , ("tan", tan) , ("teal", teal) , ("thistle", thistle) , ("tomato", tomato) , ("turquoise", turquoise) , ("violet", violet) , ("wheat", wheat) , ("white", white) , ("whitesmoke", whitesmoke) , ("yellow", yellow) , ("yellowgreen", yellowgreen) ] cmpColours :: (Ord a, Floating a) => Colour a -> Colour a -> Ordering cmpColours = compare `on` toTuple . toSRGB where toTuple (RGB x y z) = (x, y, z) main :: IO () main = do args <- getArgs let count = case args of [arg] | all isDigit arg -> Just (read arg) [] -> Nothing _ -> error "usage" mapM_ putStrLn -- print them . maybe id take count -- keep at most `count' colours . filter (not.("gray"`isInfixOf`)) -- removing some duplicates . map fst $ (allNamedColours :: [(String,Colour Double)])