REF make color module more functional

This commit is contained in:
Nathan Dwarshuis 2022-07-23 23:52:13 -04:00
parent 25b2ddf2fd
commit f05b4ea4b7
3 changed files with 40 additions and 38 deletions

View File

@ -293,6 +293,7 @@ properties:
properties:
color:
type: integer
maximum: 0xffffff
alpha: &alpha
type: number
minimum: 0
@ -311,6 +312,7 @@ properties:
maximum: 1
color:
type: integer
maximum: 0xffffff
gradient_alpha:
type: array

View File

@ -1,4 +1,5 @@
local err = require 'err'
local pure = require 'pure'
--------------------------------------------------------------------------------
-- colors
@ -17,9 +18,7 @@ local rgba = function(hex, alpha)
return err.set_type(obj, "color")
end
local rgb = function(hex)
return rgba(hex, 1.0)
end
local rgb = pure.partial(pure.flip(rgba), 1.0)
--------------------------------------------------------------------------------
-- Gradients
@ -27,30 +26,35 @@ end
-- these are tables like {[stop] :: color} where stop is a float between 0 and 1
-- and color is a color as defined above
local _make_gradient = function(colorstops, f)
local c = {}
for stop, spec in pairs(colorstops) do
assert(
stop <= 1 and stop >= 0,
"ERROR: color stop must be between 0 and 1; got " .. stop
local _make_gradient = function(f)
return pure.compose(
pure.partial(pure.flip(err.set_type), "gradient"),
err.safe_table,
pure.array_to_map,
pure.partial(pure.kmap, function(stop, spec) return {stop, f(spec)} end)
)
c[stop] = f(spec)
end
return err.set_type(err.safe_table(c), "gradient")
end
-- {[stop] :: hex} -> Gradient
local gradient_rgb = function(colorstops)
return _make_gradient(colorstops, rgb)
end
local gradient_rgb = _make_gradient(rgb)
-- {[stop] :: {hex, alpha}} -> Gradient
local gradient_rgba = function(colorstops)
return _make_gradient(
colorstops,
function(spec) return rgba(spec[1], spec[2]) end
local gradient_rgba = _make_gradient(function(spec) return rgba(spec[1], spec[2]) end)
--------------------------------------------------------------------------------
-- Yaml config to pattern tree
local compile_gradient = pure.compose(
gradient_rgb,
pure.array_to_map,
pure.partial(pure.map, function(g) return {g.stop, g.color} end)
)
local compile_gradient_alpha = pure.compose(
gradient_rgba,
pure.array_to_map,
pure.partial(pure.map, function(g) return {g.stop, {g.color, g.alpha}} end)
)
end
local compile_patterns
@ -62,21 +66,9 @@ compile_patterns = function(patterns)
elseif v.color ~= nil then
r[k] = rgba(v.color, v.alpha)
elseif v.gradient ~= nil then
local p = {}
local g = v.gradient
for i = 1, #g do
local _g = g[i]
p[_g.stop] = _g.color
end
r[k] = gradient_rgb(p)
r[k] = compile_gradient(v.gradient)
elseif v.gradient_alpha ~= nil then
local p = {}
local g = v.gradient_alpha
for i = 1, #g do
local _g = g[i]
p[_g.stop] = {_g.color, _g.alpha}
end
r[k] = gradient_rgba(p)
r[k] = compile_gradient_alpha(v.gradient_alpha)
else
r[k] = compile_patterns(v)
end

View File

@ -77,6 +77,14 @@ M.imap = function(f, seq)
return r
end
M.kmap = function(f, seq)
local r = {}
for k, v in pairs(seq) do
r[k] = f(k, v)
end
return r
end
M.map_keys = function(key, tbls)
local r = {}
for i = 1, #tbls do
@ -119,8 +127,8 @@ end
M.array_to_map = function(arr)
local r = {}
for i = 1, #arr do
r[arr[i][1]] = arr[i][2]
for _, v in pairs(arr) do
r[v[1]] = v[2]
end
return r
end