(local sprite _G.app.activeSprite)
(local colors {"#000000" :0
               "#b00258" :1
               "#1e2bff" :2
               "#ce2dff" :3
               "#007e28" :4
               "#808080" :5
               "#00a9ff" :6
               "#9eabff" :7
               "#615400" :8
               "#ff5600" :9
               ; "#808080" :a
               "#ff81d7" :b
               "#31d200" :c
               "#e1d400" :d
               "#4ffda7" :e
               "#ffffff" :f})
(fn hex->rgb [rgb]
   {:r (tonumber (rgb:sub 2 3) 16)
    :g (tonumber (rgb:sub 4 5) 16)
    :b (tonumber (rgb:sub 6 7) 16)})
(fn alist-len [alist]
  (accumulate [len 0 k v (pairs alist)] (+ 1 len)))
(when sprite
  (let [pal (Palette (alist-len colors))
        image (Image sprite)]
    (set app.clipboard.text
      (accumulate [acc "" it (image:pixels)]
        (let [raw (it)
              {: x : y } it
              r (app.pixelColor.rgbaR raw)
              g (app.pixelColor.rgbaG raw)
              b (app.pixelColor.rgbaB raw)]
          (.. acc (or (. colors (string.format "#%02x%02x%02x" r g b)) "") (if (= x 15) "\n" "")))))

    (var len 0)
    (each [color _ (pairs colors)]
      (pal:setColor len (Color (hex->rgb color)))
      (set len (+ 1 len)))
    (sprite:setPalette pal)
    (app.refresh)))