function sample(interpolator, precision = 0.1, maxIters = 1e3){
const start = new Node(0, interpolator(0));
const mid = new Node(0.5, interpolator(0.5));
const end = new Node(1, interpolator(1));
start.next = mid;
mid.next = end;
let iters = 0;
while (iters < maxIters) {
let any = false;
let current = start;
while (current && current.next) {
const t = 0.5 * (current.value + current.next.value);
const p = interpolator(t);
if (lineLength([ p, lineMidpoint([current.point, current.next.point]) ]) > precision) {
any = true;
const n = new Node(t, p, current.next);
current.next = n;
current = n.next;
} else {
current = current.next;
}
}
if (!any) {
break;
} else {
iters++;
}
}
const points = [];
let current = start;
while (current) {
points.push(current.point);
current = current.next;
}
return points;
}