code: function map(collection, fn, ctx) {
    const [col, func] = isFunction(collection) ? [null, collection.bind(fn)] : [collection, fn.bind(ctx)];
    return col ? sequence(col, map(func)) : xform => mapTransducer(func, xform);
  }
docs: **Creates a new collection whose values are the results of mapping input collection elements over a function.**
  
  If no collection is provided, a function is returned that can be passed to `{@link module:xduce.sequence|sequence}`,
  et al.
  
  ```
  const result = map([1, 2, 3, 4, 5], x => x * x);
  // result = [1, 4, 9, 16, 25]
  ```
  
  @memberof module:xduce.transducers
  
  @param {*} [collection] An optional input collection that is to be transduced.
  @param {function} fn A function that is supplied each input collection element in turn. The return values of this
  function become the elements of the output collection.
  @param {object} [ctx] An optional context object which is set to `this` for the function `fn`. This does not work if
  `fn` is an arrow function, as they cannot be bound to contexts.
  @return {(*|module:xduce~transducerFunction)} If a collection is supplied, then the function returns a new
  collection of the same type containing the return values of `fn` when passed those elements. If no collection is
  supplied, a transducer function, suitable for passing to `{@link module:xduce.sequence|sequence}`,
  `{@link module:xduce.into|into}`, etc. is returned.