A contract, not a costume
Same answer.
Different API.
One realization captures a curve description. The other prepares polynomial coefficients. The contract connects their observations—not their method names, objects, or internal machinery.
const curve = compile(
bezier(0, 0, 1024, 1024)
);
if (!curve.ok) throw Error();
sample(curve.value, t);
tangent(curve.value, t);
const curve = prepare(
[0, 0, 1024, 1024]
);
const { value, tangent }
= curve.at(t);