class Colour

def initialize(value)

def initialize(value)
  @string = value
  @triplet = case value
  when Colour
    @string = value.string.dup
    value.triplet.dup
  when Array
    value.take(3).map(&:round)
  when *COLOURS.keys
    COLOURS[value]
  when /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i
    [$1, $2, $3].map { |hex| Integer("0x#{hex}") }
  when /^rgb\((\d{1,3}), *(\d{1,3}), *(\d{1,3})\)$/
    [$1, $2, $3].map(&:to_i)
  when /^hsl\((\d{1,3}), *(\d{1,3})%, *(\d{1,3})%\)$/
    h, s, l = [$1, $2, $3].map(&:to_i)
    h %= 360;
    c = (100 - (2 * l - 100).abs) * s / 10000.0
    x = (60 - (h % 120 - 60).abs) * c / 60.0
    m = (l - 50 * c) / 100.0
    r, g, b = case
    when s == 0  then [0, 0, 0]
    when h <  60 then [c, x, 0]
    when h < 120 then [x, c, 0]
    when h < 180 then [0, c, x]
    when h < 240 then [0, x, c]
    when h < 300 then [x, 0, c]
    when h < 360 then [c, 0, x]
    end.map do |v|
      255 * (v + m)
    end.map(&:to_i)
  end
  raise Error, "invalid colour: #{value}" unless @triplet&.all?(0..255)
  @string = "rgb(%i,%i,%i)" % @triplet unless String === @string
  @string.tr! ?\s, ""
end