function renko(data, { x = "date", y = "value", brick_size = 10.0 } = {}) {
const dates = Plot.valueof(data, x);
const values = Plot.valueof(data, y);
const B = brick_size;
const bricks = [];
let i = 0;
let rank = 0;
const v = values[i];
let brick = {
rank,
start: i,
x1: dates[i],
v1: v,
v: (0.5 + Math.floor(v / B)) * B,
floor: Math.floor(v / B) * B,
ceil: (1 + Math.floor(v / B)) * B
};
let j = i;
for (; i < values.length; ++i) {
const v = values[i];
if (Math.abs(v - brick.v) < 0.5 * B) {
j = i;
}
while (Math.abs(v - brick.v) >= 1.5 * B) {
brick.v2 = values[j];
brick.x2 = dates[j];
brick.end = j;
const direction = Math.sign(v - brick.v);
if (rank === 0) brick.direction = direction;
bricks.push(brick);
brick = {
rank: ++rank,
direction,
start: j,
x1: dates[j],
v1: values[j],
v: brick.v + direction * B,
floor: brick.floor + direction * B,
ceil: brick.ceil + direction * B
};
j = i;
}
}
brick.end = i - 1;
brick.x2 = dates[i - 1];
brick.v2 = values[i - 1];
bricks.push(brick);
return bricks;
}