Как вызвать функцию, которая является параметром Function.prototype.bind со значением, переданным как параметр Function.prototype.bind

Учитывая

const n = 1;

function value(data) {
  return data === 1 && data;
}

function compare(data, next) {
  return !!(1 == data === next ? next(data) : value(data));
}

function isOne(a, b) {
  return !isNaN(a) && b()
}

function result(x, fn) {
  return fn ? fn(x) : x(n);
}

мы можем назвать result()

result(1, function(data) {return compare(data)}); // true

result(1, function(data) {return compare(value(data))}); // true

result(0, compare.bind(value)); // false

result(compare); // true

result(0, compare); // false

 result(1, function(data) {
   return isOne(data, compare.bind(null, data, value))
 }); // true

С каждым шаблоном вызова, в результате чего возвращаемое значение result составляет true.

Как мы можем вызвать функцию value как параметр в compare с помощью Function.prototype.bind, Function.prototype.call, Function.prototype.apply или другого подхода без явного использования шаблона function() {} или изменения функций value, compare или result?

Например

// where `value` is called with passed `1` as parameter which
// becomes parameter to `compare` call, which becomes parameter
// to `isOne`, with expected return value of `result` being `true`
result(1, isOne.bind(null, compare.bind(null, value)));

const n = 1;

function value(data) {
  console.log("value", data);
  return data === 1 && data;
}

function compare(data, next) {
  console.log("compare", data, next);
  return !!(1 == data === next ? next(data) : value(data));
}

function result(x, fn) {
  console.log("result", x, fn);
  return fn ? fn(x) : x(n);
}

function isOne(a, b) {
  console.log("isOne", a, b);
  return !isNaN(a) && b()
}

console.log(result(1, function(data) {
  return compare(data, value)
})); // true
console.log(result(0, compare.bind(value))); // false
console.log(result(compare.bind(value))); // true
console.log(result(compare)); // true
console.log(result(1, function(data) {
  return isOne(data, compare.bind(null, data, value))
})); // true
 // how can we pass `1` to `value`
 // expected result: `true`, returns `false`
console.log(result(1, isOne.bind(null, compare.bind(null, value))));

Ответы