Better `read` and `write`

The first version of the functional asynchronous read and write[1] require simple values to be wrapped into the callback function.

var value = value => result => result(null, value);
save(value('test1.out'), value('ok'))();

Of course, the implementation of the read and write can help developer a bit and accept both simple and callback values:

var read = filepath =>  
  callback => {
    let impl = filepath => {
      let options = { encoding : 'utf8' };
      fs.readFile(filepath, options, callback);
    };
    return ('function' === typeof filepath)
      ? filepath((_, filepath) => impl(filepath))
      : impl(filepath);
  };

var write = (filepath, data) =>
  callback => {
    let impl1 = (filepath, data) =>
      fs.writeFile(filepath, data, callback);
    let impl2 = filepath =>
      ('function' === typeof data)
        ? data((_, data) => impl1(filepath, data))
        : impl1(filepath, data);
    return ('function' === typeof filepath)
      ? filepath((_, filepath) => impl2(filepath))
      : impl2(filepath);
  };

Now it is possible to mix simple and asynchronous values in arguments:

// creates test1.out file with "ok" in it
save('test1.out', 'ok')();

// copies test.in into test.out
write('test.out', read('test.in'))();

// prints content of the test.in file
read('test.in')((_, data) => console.log(data));

  1. Functional Asynchronous Programming in node.js, https://alexatnet.com/functional-asynchronous-programming-in-node-js/ ↩︎