

function binop(a, b, f)
{
  if (typeof a == "array")
  {
    if (typeof b == "array")
    {
      assert(a.len()==b.len())

      local r=[]
      foreach (i, x in a) r.append(f(x, b[i]))
      return r;
    }
    else
      return a.map(@(x) f(x, b));
  }
  else
  {
    if (typeof b == "array")
      return b.map(@(x) f(a, x));
    else
      return f(a, b);
  }
}


function mul(a, b) { return binop(a, b, @(x, y) x*y) }
function add(a, b) { return binop(a, b, @(x, y) x+y) }

function lerp(a, b, t) { return binop(a, b, @(x, y) x*(1-t)+y*t) }


function maxElem(a) { return a.reduce(@(m, x) x>m?x:m) }


function fromRgb(r, g, b)
{
  local c=[r, g, b];
  c=mul(c, 1.0/255);
  return mul(c, c);
}
